BZOJ2456 mode

Description

给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数。

Input

第1行一个正整数n。
第2行n个正整数用空格隔开。

Output

    一行一个正整数表示那个众数。

Sample Input

5
3 2 3 1 3

Sample Output

3

HINT

100%的数据,n<=500000,数列中每个数<=maxlongint。

 

正解:。。。

解题报告:

  首先题目要求的是出现次数大于n/2的数,显然这个数的出现次数比别的数都要多,那么我们可以考虑用这个数独特的超多的出现次数来得到这个数。

  因为超过一半,不妨考虑一定会大于其他所有数的个数之和。那么我们每得到一个数,就与之前保存的数(即当前出现次数最多且未被抵消的数)比较,如果与之前的不同,tot--,相当于是抵消了一个。如果发现tot=0,那么说明之前的数字耗尽了,那么我们把新的读进来的数作为新的保存的数就可以了。

  神奇的地方就在于这个抵消操作。最后得到的数字一定会是众数。

  然而我开始MLE了2发,头文件开多了。。。

 

 1 #include <cstdio>
 2 using namespace std;
 3 int n,now,now_tot,cun;
 4 int main()
 5 {
 6   scanf("%d",&n);
 7   for(int i=1;i<=n;i++) {
 8       scanf("%d",&now);
 9       if(now_tot==0) { now_tot=1; cun=now; }
10       else if(now==cun) now_tot++;
11       else now_tot--;
12   }
13   printf("%d",cun);
14   return 0;
15 }

 

posted @ 2016-07-30 18:02  ljh_2000  阅读(497)  评论(0编辑  收藏  举报