CodeVs4419 FFF团卧底的菊花
时间限制:2s 空间限制64.0MB
题目描述 Description
FFF 团卧底在这次出题后就知道他的菊花可能有巨大的危险,于是他提前摆布好了菊花阵,现在菊花阵里有若干朵菊花,出现次数最多的那一朵就是出题人的,你的任务是需要找出出题人的菊花。
输入描述 Input Description
第一行为 n
第二行为 n 朵菊花
输出描述 Output Description
一行,为出题人的菊花
样例输入 Sample Input
5
1 1 1 2 3
样例输出 Sample Output
1
数据范围及提示 Data Size & Hint
对于 100%的数据,n<=5000000,每个数都在 int 范围内,保证出题人的菊花出现的次数大于等于[n/2]
把CodeVs上我的题解搬过来:
如果一个数的出现次数大于N/2,则它的前五位的出现次数也一定是大于N/2,后五位的出现次数也大于N/2,而且都是唯一大于N/2的,所以找出出现次数最多的前五位数、后五位数,拼起来就是解。因为可能有负数,所以可以先把读入的数加上2147483648,再进行处理,最后别忘了减去2147483648 #include <cstdio> #include <set> #include <cstring> #define inf 0x7fffffff using namespace std; int a[600050], b[600050]; int main() { long long i, x, t, N=0, _N, maxi, maxx; getnum(N); for(i=1;i<=N;i++) { x=0; scanf("%lld",&x); x+=inf; x++; a[x%100000]++; b[x/100000]++; } for(i=1;i<=99999;i++) { if(a[i]>=N/2 && a[i]<=N) { t=i; break; } } for(i=1;i<=99999;i++) { if(b[i]>=N/2 && b[i]<=N) { t=i*100000+t; break; } } t=t-inf; t--; printf("%lld\n",t); return 0; }