2456: mode

2456: mode

Time Limit: 1 Sec  Memory Limit: 1 MB
Submit: 4798  Solved: 2009
[Submit][Status][Discuss]

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。

zju2132 The Most Frequent Number

Source

/*
* Author: lyucheng
* Created Time: 2017年05月14日 星期日 17时17分40秒
* File Name: /media/lyucheng/Work/ACM源代码/数学--数论/乱搞/BZOJ-2456.cpp
*/
/* 题意:给你一个n个数的序列,ai<=longmaxint,然后让你求出出现次数超过 n/2的众数
*
* 思路:map映射不可行,可以离散化优化一下,还是超时,可能不是超时的问题,应该是超内存,显然500000个LL开数组肯定会超时的
* 所以不能开数组,看了题解才发现这个神奇的算法,众数肯定是出现次数最多的那个数,现在让所有不相同的数进行两两抵消
* 那么剩下的肯定是数量最多的那一个了
* */
#include <cstdio>
int n;
int x;
int now;//当前遍历到的数
int res;//表示现在相同的数的数量
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&x);
if(x==now) res++;//如果两个数相等,那么相等的数量+1
else if(res==){//如果当前没有相等的数了
now=x;res=;
}else res--;//不相等就-1
}
printf("%d\n",now);
return ;
}
上一篇:C#中枚举类型和int类型的转化


下一篇:Git 安装和使用Tips