mode
mode (jdoj-2905)
题目大意:给你一个n个数的数列,其中某个数出现了超过$\lfloor\frac{n}{2}\rfloor$即众数,请你找出那个数。
注释:n<=$5\cdot 10^5$,数列中的数<=int。
特殊判定:内存<=1MB。
想法:看到特判......傻题秒变好题啊有木有!!显然,由于内存的限制,不支持我们开数组离散化。所以,yy.....yy......yy........咳咳,在此鸣谢(CQzhangyu lijinnn Edward♂Frog Tonyzhao GXZlegend)(忘记谁教我的了,枚举扩友)。我们可以开一个cnt记录一下当前出现次数最多的数的出现次数。怎么记录呢?如果当前数和我们所记录的不同,那么将所记录的cnt--,反之++。为什么成立?因为对于这里的每一个数,那个我们要求的数是到最后被减光的话cnt也是正的,故,成立。
神题!铭记......
最后,附上丑陋的代码......
1 #include <cstdio> 2 int main() 3 { 4 int n; 5 scanf("%d",&n); 6 int mx; 7 int a; 8 scanf("%d",&a); 9 mx=a; 10 int cnt=1; 11 for(int i=2;i<=n;i++) 12 { 13 scanf("%d",&a); 14 if(mx==a) cnt++; 15 else 16 { 17 cnt--; 18 if(!cnt) mx=a,cnt=1; 19 } 20 } 21 printf("%d",mx); 22 return 0; 23 }
小结:错误....没有啊
| 欢迎来原网站坐坐! >原文链接<