bzoj 2456

因为“出现了超过n div 2次即众数”,所以其他所有数出现的次数之和是小于众数出现的次数的。

于是把每个数和一个与它不同的数相抵消,剩下的就是答案。

#include<cstdio>
#include<cctype>
int read(){
    char c; while(!isdigit(c=getchar())); int x=c-'0';
    while(isdigit(c=getchar())) x=x*10+c-'0'; return x;
}
int main(){
    int n=read(),ans=read(),num=1;
    while(--n){
        int k=read();
        if(ans==k) num++;
        else num--;
        if(!num) ans=k,num=1;
    }
    printf("%d",ans);
    return 0;
}

 还有一种比较容易想到的。

把一个数拆成二进制。

当一个位置上1的个数大于n/2时,那么答案的这一位就是1,否则为0。

#include<cstdio>
#include<cctype>
int read(){
    char c; while(!isdigit(c=getchar())); int x=c-'0';
    while(isdigit(c=getchar())) x=x*10+c-'0'; return x;
}
int a[32];
int main(){
    int n=read();
    while(n--){
        int x=read();
        for(int i=0;i<31;i+=1)
            if(x&(1<<i)) a[i]++; else a[i]--;
    }
    int ans=0;
    for(int i=0;i<31;i+=1) ans+=(1<<i)*(a[i]>0);
    printf("%d",ans);
    return 0;
}

 

posted @ 2017-10-30 12:49  或是七一  阅读(93)  评论(0编辑  收藏  举报