[BZOJ] 2456: mode #眾數計數法
阿新 • • 發佈:2017-11-02
其中 mit strong gree memory aps ble stat 一行
Submit: 5969 Solved: 2414
[Submit][Status][Discuss]
3 2 3 1 3
2456: mode
Time Limit: 1 Sec Memory Limit: 1 MBSubmit: 5969 Solved: 2414
[Submit][Status][Discuss]
Description
給你一個n個數的數列,其中某個數出現了超過n div 2次即眾數,請你找出那個數。
Input
第1行一個正整數n。
第2行n個正整數用空格隔開。
Output
一行一個正整數表示那個眾數。
Sample Input
53 2 3 1 3
Sample Output
3HINT
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 #眾數計數法