bzoj 2456 mode
Posted Kaiser
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 2456 mode相关的知识,希望对你有一定的参考价值。
给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数。
Input
第1行一个正整数n。
第2行n个正整数用空格隔开。
Output
一行一个正整数表示那个众数。
Sample Input
5
3 2 3 1 3
3 2 3 1 3
Sample Output
3
HINT
100%的数据,n<=500000,数列中每个数<=maxlongint。
题解
给你一个n(<=500000)个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数。
如果内存限制是10MB以上的话那么显然排个序就解决问题了。但是这道题的内存限制是1MB,那就意味着你不能开数组。这题有一个神算法:把每个数和一个与它不同的数相抵消,由于要求的数出现了超过n div 2次,那么最后剩下的就是答案。
这题是阿里巴巴面试题。
1 #include<cstdio> 2 using namespace std; 3 4 int main() 5 { 6 int x,n,now=-1,num=0; 7 scanf("%d",&n); 8 for (int i=1;i<=n;i++) 9 { 10 scanf("%d",&x); 11 if (x==now) num++; 12 else if (num!=0) num--; 13 else 14 { 15 now=x; 16 num=1; 17 } 18 } 19 printf("%d",now); 20 }
以上是关于bzoj 2456 mode的主要内容,如果未能解决你的问题,请参考以下文章