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 }
  • 相关阅读:
    五种线程池的分类与作用
    什么是死锁?
    事务隔离级别区分,未提交读,提交读,可重复读
    共享锁(读锁)和排他锁(写锁)
    java中的成员变量和全局变量的区别
    Algorithm
    6
    5
    4
    3
  • 原文地址:https://www.cnblogs.com/ljh2000-jump/p/5721463.html
Copyright © 2011-2022 走看看