=== ===
这里放传送门
=== ===
题解
一看这题内存1M卡得丧心病狂啊。。。数都存不下啊。。
但是吧它已经告诉你有一个数出现超过一半了,那也就是说这个众数出现的次数一定比不是众数的数要多
那么如果把每个众数和一个不是众数的数配对,最后一定会剩下一坨众数
于是每次读进来一个数,让不同的数相互抵消,最后剩下一个就是众数啦
诶好像这题头文件开太多都会炸飞吧?反正ATP没试过= =
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,cnt;
long long k;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++){
long long x;
scanf("%I64d",&x);
if (k==0) k=x;
if (x==k) ++cnt;
else{
--cnt;
if (cnt==0) k=0;
}
}
printf("%I64d\n",k);
return 0;
}
偏偏在最后出现的补充说明
“超过一半”这个条件如果好好注意一下似乎是可以发现有趣的东西的