洛谷P2397 yyy loves Maths VI (mode)
原题链接P2397 yyy loves Maths VI (mode)
题目描述
他让redbag找众数
他还特意表示,这个众数出现次数超过了一半
一共n个数,而且保证有
n<=2000000
而且每个数<2^31-1
输入输出格式
输入格式:
第一行一个整数n
第二行n个整数
输出格式:
一行,这个众数
输入输出样例
说明
时间限制 1s
空间限制 3.5M(你没看错3.5M)
有人想水过,但我告诉你这空间是不够的
题解
此题的算法是一种及其偏门的数学做法:摩尔投票
算法的思路十分简单,我们记录一个值val和一个计数器cnt,每加入一个值就和val比较,如果相等就将cnt加1,否则将cnt减1,如果cnt为0就替换掉val
这个算法的正确性很好证明:只要一个数的数量大于总数的1/2就可以替换掉所有其他数,
就像N个人打群架,一个人抵消另一个人,只要其中一方的势力(人数)大于总数的一半,就可以抵消任何其他势力并且还有人剩余
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const int INF=1e9+7; 5 int N,val=-1,num=1; 6 int main(){ 7 scanf("%d",&N); 8 for(int i=1;i<=N;i++){ 9 int ii; 10 scanf("%d",&ii); 11 if(val==ii){ 12 num++; 13 }else{ 14 num--; 15 if(num==0){ 16 num=1; 17 val=ii; 18 } 19 } 20 } 21 printf("%d",val); 22 return 0; 23 }