mode

mode (jdoj-2905)

    题目大意:给你一个n个数的数列,其中某个数出现了超过$lfloorfrac{n}{2} floor$即众数,请你找出那个数。

    注释:n<=$5cdot 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 }

    小结:错误....没有啊

 

原文地址:https://www.cnblogs.com/ShuraK/p/7931348.html