CodeVS4419FFF团的菊花

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]

    真是一道 水题啊,我花了一个半小时才做出来。幸运的是AC了。刚刚看到这道题的时候惊呆了,怎么把这么弱的题放在第三题。可是等了一会同学让我刷新网页才发现,内存竟然成了32MB,我再一次惊呆了。等我静下来思考才发现,改内存限制并没有改变它是 水题这个事实。

    把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;
}

你可能感兴趣的:(CodeVS4419FFF团的菊花)