洛谷P2397 yyy loves Maths VI (mode)

原题链接P2397 yyy loves Maths VI (mode)

题目描述

他让redbag找众数

他还特意表示,这个众数出现次数超过了一半

一共n个数,而且保证有

n<=2000000

而且每个数<2^31-1

输入输出格式

输入格式:

第一行一个整数n

第二行n个整数

输出格式:

一行,这个众数

输入输出样例

输入样例#1: 复制
5
2 3 3 3 3
 
输出样例#1: 复制
3

说明

时间限制 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 }
原文地址:https://www.cnblogs.com/guoshaoyang/p/10587964.html