1. 程式人生 > >[BZOJ] 2456: mode #眾數計數法

[BZOJ] 2456: mode #眾數計數法

其中 mit strong gree memory aps ble stat 一行

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 }
計數

[BZOJ] 2456: mode #眾數計數法