[BZOJ] 2456: mode #众数计数法
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
5
3 2 3 1 3
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 }
转载请注明出处 -- 如有意见欢迎评论