zoukankan      html  css  js  c++  java
  • BZOJ2456 mode

    Description

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

    Input

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

    Output

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

    Sample Input

    5
    3 2 3 1 3

    Sample Output

    3

    HINT

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

    正解:。。。

    解题报告:

      首先题目要求的是出现次数大于n/2的数,显然这个数的出现次数比别的数都要多,那么我们可以考虑用这个数独特的超多的出现次数来得到这个数。

      因为超过一半,不妨考虑一定会大于其他所有数的个数之和。那么我们每得到一个数,就与之前保存的数(即当前出现次数最多且未被抵消的数)比较,如果与之前的不同,tot--,相当于是抵消了一个。如果发现tot=0,那么说明之前的数字耗尽了,那么我们把新的读进来的数作为新的保存的数就可以了。

      神奇的地方就在于这个抵消操作。最后得到的数字一定会是众数。

      然而我开始MLE了2发,头文件开多了。。。

     1 #include <cstdio>
     2 using namespace std;
     3 int n,now,now_tot,cun;
     4 int main()
     5 {
     6   scanf("%d",&n);
     7   for(int i=1;i<=n;i++) {
     8       scanf("%d",&now);
     9       if(now_tot==0) { now_tot=1; cun=now; }
    10       else if(now==cun) now_tot++;
    11       else now_tot--;
    12   }
    13   printf("%d",cun);
    14   return 0;
    15 }
  • 相关阅读:
    c语言中的隐式函数声明(转)
    static关键字
    Eclipse中spring项目的XML文件的问题
    spring 中c3p0的优化配置
    Mysql通过SQL脚本复制表
    tomcat 设置内存
    删除无限循环的文件夹-删除递归文件夹
    使用cnpm代替npm
    数据库框架的log4j日志配置
    Win7删除远程连接历史记录
  • 原文地址:https://www.cnblogs.com/ljh2000-jump/p/5721463.html
Copyright © 2011-2022 走看看