這道題是組隊賽上遇到的,我當時腦袋卡住了,寫了個暴力血筑,剛開始還寫錯了,后來知道雙層循環(huán)暴力肯定會超時的時候煎楣,比賽已經(jīng)結(jié)束了豺总,過后聽學(xué)長講題的時候知道這個題其實直接用兩個for循環(huán),2n的復(fù)雜就可以做出來的择懂。真的覺得我當時太智障了喻喳,這個題其實就是個水題。
題意大概就是老師要圍著一個圓桌開一個主題課困曙,讓同學(xué)們寫下他希望第幾個發(fā)言表伦,成績好的希望先發(fā)言,成績差的希望后發(fā)言慷丽,多一些準備時間蹦哼,發(fā)言時間是按順時針順序,一個接一個要糊,給1-n個同學(xué)編號纲熏,題目要求確定從哪個同學(xué)開始按照順時針順序發(fā)言,能夠使得不滿意的同學(xué)的人數(shù)最少锄俄。
我開始想的就是直接暴力枚舉局劲,遍歷編號從1到n的人第一個發(fā)言所造成的不滿的人數(shù),找到最小的那個奶赠,并記錄他的下標鱼填。然后輸出下標就行了,然而這種想法肯定是會超時的毅戈。能A的想法是根據(jù)每一個人希望發(fā)言的順序剔氏,找到此時第一個發(fā)言的人的下標m = i-a[i]+1,開一個vis數(shù)組vis[m]++,表示這個人被期望第一個發(fā)言的次數(shù)+1竹祷,最后只要遍歷vis[1]到vis[n]中最大的數(shù)字谈跛,在輸出它的下標就得到了最終答案。
代碼如下:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[100010];
int vis[100010];
int main()
{
int n,m;
scanf("%d",&n);
for(int i = 1;i<=n;i++)
{
scanf("%d",&a[i]);
m = i-a[i]+1;
if(m<=0)
{
vis[m+n]++;
}
else
{
vis[m]++;
}
}
int max = 0,k = 0;
for(int i = 1;i<=n;i++)
{
if(vis[i]>=max)
{
max = vis[i];
k = i;
}
}
printf("%d\n",k);
}
好吧塑陵,后來隊友告訴我這類問題叫做投票問題