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
Source
这道题的难点在于空间限制(1MB的空间限制,如果代码写的比较丑也会MLE。。。),考虑这样一种做法,先设,同时用记录当前出现次数减去其他数出现次数,如果,则用当前的更新,最后得到的就是最后答案,这个算法的正确性依赖于题目中的条件即出现的次数大于,考虑这个算法的实现过程,可以发现这个代码相当于将任意两个不同的数消去,显然只有不会被全部消完(因为哪怕拿其它所有数和它相消都不够),所以这个算法是正确的,下面是程序:
#include<stdio.h>
int n,s,x,sum=1;
int main(){
scanf("%d%d",&n,&s);
while(--n){
scanf("%d",&x);
if(s==x){
sum++;
}
else{
sum--;
if(!sum){
sum=1;
s=x;
}
}
}
printf("%d\n",s);
return 0;
}