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; }