zoukankan      html  css  js  c++  java
  • 一道并不水的水题

    BZOJ 2456  MODE

    时间1s,空间1MB

    给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数。

    第1行一个正整数n。
    第2行n个正整数用空格隔开。

     一行一个正整数表示那个众数。

    5
    3 2 3 1 3
    3

     100%的数据,n<=500000,数列中每个数<=maxlongint。

     
     内存限制是1MB,所以肯定不能开数组,那么就需要好好想一想了,
    找出一堆数中出现次数超过一半的数,题解的思路很神奇……
    #include<cstdio>
    int main()
    {
        int n;
        scanf("%d",&n);
        int maxl=0,k3=0;
        for(int i=1;i<=n;++i)
        {
            int sum;
            scanf("%d",&sum);
            if(sum==kkksc03)
                maxl++;
            else maxl--;
            if(maxl<=0)
            {
                maxl=1;
                k3=sum;
            }
        }
        printf("%d",k3);
        return 0;
    }
    mode

    最坑的是加上iostream都会超时,这就很费解了,用习惯cin、cout、max、min等函数的同学可能不适合在BZOJ生存

    思路:由于众数出现的次数*2会超过n,所以可以用一个变量记录第一次输入的值,下一次相同计数器就++,不同--,直到减到0,然后把变量改成这次的输入值

    最后变量所记录的就是答案,为甚摸会拙样呢,应为答案之外所有的数出现次数没有众数多,即使全部抵销也还是会剩下一个答案的。

    这个代码所模拟的就是答案和其他数不断消耗的过程。

  • 相关阅读:
    Ubuntu 更换软件源
    Ubuntu 配置 SOCKS5
    Ubuntu 配置 Sha-dow-socks
    frp(内网穿透)
    solr 远程代码执行(CVE-2019-12409)
    多线程处理爬虫
    python实现文件自动排序
    python 实现根据文件名自动分类移动至不同的文件夹
    Centos7如何开启任意端口服务
    centos7默认安装没有连接网络
  • 原文地址:https://www.cnblogs.com/qdscwyy/p/6838130.html
Copyright © 2011-2022 走看看