2456: mode
Time Limit: 1 Sec Memory Limit: 1 MBSubmit: 2754 Solved: 1165
[ Submit][ Status][ Discuss]
Description
给你一个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。
zju2132 The Most Frequent Number
Source
/*
n个数,保证存在某数出现次数 > n div 2,求该数(n<=500000,Memory Limit : 1MB)
又是求众数,不过这次只用求整体的正数,而空间限制也只给了1MB,直接排序会MLE
稍微总结一下众数的各种性质吧:
性质一:如果一个数在某区间内出现的次数大于区间长度的一半,则这个数一定是该区间的第(r - l + 1) >> 1 大 -->可以用划分树求区间第k大
性质二:如果一个数在某区间内出现的次数大于区间长度的一半,则这个数的每个二进制位在该区间内出现的次数也一定大于区间长度的一半!!!所以就可以直接确定出那个数!!!!!
性质三:对两两不相等的数进行抵消,则最后剩下的数则是该众数!!!
用num记录当前抵消后剩下的数,当num=0的时候把该数变为tmp,不等则cnt--,相等则cnt++
表示不懂,先用着吧,看看能不能找到资料解决这个问题吧
*/
#include<cstdio>
int main()
{
int n,num,i,cnt,tmp;
scanf("%d%d",&n,&num);
cnt=1;
for(i=2;i<=n;i++)
{
scanf("%d",&tmp);
if(cnt==0)
{
cnt=1;
num=tmp;
continue;
}
if(tmp==num) cnt++;
else cnt--;
}
printf("%d\n",num);
return 0;
}