[bzoj2456]mode 题解

改题改自闭的时候当然要靠水题来调节心情(逃

 

2456: mode

Time Limit: 1 Sec  Memory Limit: 1 MB
Submit: 8461  Solved: 3171
[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。

 

裸的摩尔投票法。

$1MB$的内存显然不能开任何数组。维护两个变量$id,cnt$。当$cnt$为0时,令当前输入的数为$id$,然后把$cnt$置为1。否则,如果当前输入与$id$相等则$cnt++$,反之$cnt--$。

因为只需要求出现次数大于$\frac{n}{2}$的数,所以只维护当前有可能成为答案的数,如果出现了别的数相当与抵消了一次这个数的贡献,出现了这个数那么贡献+1。

#include
int n,x,id,cnt;
void add(int x)
{
    if(!cnt)id=x,cnt=1;
    else
    {
        if(id==x)cnt++;
        else cnt--;
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        add(x);
    }
    printf("%d\n",id);
    return 0;
}

 

你可能感兴趣的:([bzoj2456]mode 题解)