[BZOJ] 2456: mode #众数计数法

2456: mode

Time Limit: 1 Sec  Memory Limit: 1 MB
Submit: 5969  Solved: 2414
[Submit][Status][Discuss]

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

鸣谢 黄祎程

Analysis

噗嗤,偏门算法总算有出头之日了

正解:某种不在OI范畴内的(摩尔?)计数法

首先准备一个变量和一个计数器,当计数器为0时,变量是空的,遇到一个元素就装进去

当遇到的元素与变量内的值不一样的时候,计数器减一,反之加一

这样,最后变量的值即为众数

当然这样会被卡双众数,弄个储存器再额外记录哩

Code

 1 #include<stdio.h>
 2 using namespace std;
 3 
 4 long long bolt = 0,cnt = 0,tmp;
 5 
 6 int main(){
 7     int n; scanf("%d",&n);
 8     
 9     for(int i = 1;i <= n;i++){
10         scanf("%lld",&tmp);
11         if(!cnt) bolt = tmp,cnt = 1;
12         else if(tmp == bolt) cnt++;
13         else cnt--;
14     }
15     
16     printf("%lld",bolt);
17     
18     return 0;
19 }
计数

 

posted @ 2017-11-02 16:19  Leviaton  阅读(270)  评论(0编辑  收藏  举报