BZOJ 2456 MODE
时间1s,空间1MB
给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数。
第1行一个正整数n。
第2行n个正整数用空格隔开。
一行一个正整数表示那个众数。
5
3 2 3 1 3
3 2 3 1 3
3
100%的数据,n<=500000,数列中每个数<=maxlongint。
内存限制是1MB,所以肯定不能开数组,那么就需要好好想一想了,
找出一堆数中出现次数超过一半的数,题解的思路很神奇……
#include<cstdio> int main() { int n; scanf("%d",&n); int maxl=0,k3=0; for(int i=1;i<=n;++i) { int sum; scanf("%d",&sum); if(sum==kkksc03) maxl++; else maxl--; if(maxl<=0) { maxl=1; k3=sum; } } printf("%d",k3); return 0; }
最坑的是加上iostream都会超时,这就很费解了,用习惯cin、cout、max、min等函数的同学可能不适合在BZOJ生存
思路:由于众数出现的次数*2会超过n,所以可以用一个变量记录第一次输入的值,下一次相同计数器就++,不同--,直到减到0,然后把变量改成这次的输入值
最后变量所记录的就是答案,为甚摸会拙样呢,应为答案之外所有的数出现次数没有众数多,即使全部抵销也还是会剩下一个答案的。
这个代码所模拟的就是答案和其他数不断消耗的过程。