码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ2456 mode

时间:2016-07-30 19:47:10      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:

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 }

 

BZOJ2456 mode

标签:

原文地址:http://www.cnblogs.com/ljh2000-jump/p/5721463.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!