BZOJ 2456 mode(找众数)

来源:互联网 发布:小黑屋码字软件下载 编辑:程序博客网 时间:2024/06/04 20:11

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。
zju2132 The Most Frequent Number

Time Limit: 1 Sec
Memory Limit: 1 MB


Solution

一道有趣的题,重点在于空间限制只有1M。
然后不能将所有的数保存,也不能数组计数。
只能读一遍出结果。
我们发现众数出现次数大于其他数出现的总和。假如众数是a,拿a与其他非a数抵消的话,肯定剩下的是a。
于是我们开四个int,n,a,val,cnt。
val代表当前的众数的值,cnt则记录众数出现的次数,若a与val相同则cnt++,否则cnt–。当cnt为0时代表该换众数的值了,cnt清掉为1,这样最后的val就是众数,搞定了。
注意头文件不要带太多,否则MLE。


CODE

#include <cstdio>int n, cnt, val, a;int main(){    scanf("%d", &n);    scanf("%d", &val);    cnt = 1;    for(; n > 1; n --){      scanf("%d", &a);      if(a == val)  cnt ++;      else{        cnt --;        if(cnt == 0)  val = a, cnt = 1;      }    }    printf("%d", val);    return 0;}

这里写图片描述

葬送。