bzoj 2456: mode ——独特水法

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。

————————————————————————————————

这道题内存1MB 有毒qwq

其实我们可以维护一个大小为1的栈 如果读进来的数和当前栈里面的数不一样 就将它的出现次数减去1

否则加1 如果它的值被减为0 就换当前数 最后栈里面的数就是答案辣 因为如果是众数的话 最差情况下它也不会被弹出去的

#include<cstdio>
#include<cstring>
#include<algorithm>
const int M=1e6+7,mod=1e5+7;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
    return ans*f;
}
int ans,h,n,k;
int main(){
    n=read();
    for(int i=1;i<=n;i++){
        k=read();
        if(!ans) ans=k,h=1;
        else{
            if(k==ans) h++;
            else{
                h--;
                if(!h) ans=k,h=1;
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}
View Code

 

posted @ 2017-11-02 16:06  友人Aqwq  阅读(157)  评论(0编辑  收藏  举报