洛谷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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值