优秀 excellent

题目描述

优秀

(excellent.cpp/c/pas)

题目描述:

有n个人,决定选出他们中最优秀的人

输入描述:

第一行一个n表示有n个人参与了投票,下一行n个数,第i个数表示第i个人投给了谁,每个人会且只会投给一个人,问得到票数最多的人是谁,数据保证得到票数最多的人得到的票数一定大于n/2。

输出描述:

一行一个整数表示最优秀的人

输入样例:

5
1 2 1 1 3

输出样例:

1

数据范围:

对于60%的数据1<=n<=2000
对于80%的数据1<=n<=2000000空间128M
对于100%的数据1<=n<=2000000空间10M

补充说明

输入的投票不一定小于等于n!

题解

摩尔投票法
简单说明:

摩尔投票算法是基于这个事实:每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。
如何理解摩尔投票算法? - 喝七喜的回答 - 知乎

代码

#include <cstdio>

inline char get_char()
{
    static const int SIZE = 2 << 16;
    static char buffer[SIZE], *S, *T;
    if (S == T)
    {
        T = (S = buffer) + fread(buffer, 1, SIZE, stdin);
        if (S == T) return EOF;
    }
    return *S++;
}

#define getchar get_char

inline int get_int()
{
    char c;
    int ret = 0;
    for (c = getchar(); c < '0' || c > '9'; c = getchar())
        ;
    for (; c >= '0' && c <= '9'; c = getchar())
        ret = (ret << 1) + (ret << 3) + (c - '0');
    return ret;
}

int main()
{
    freopen("excellent.in", "r", stdin);
    freopen("excellent.out", "w", stdout);
    int n = get_int(), a = 0, k = 0;
    for (int i = 0; i < n; ++i)
    {
        int tmp = get_int();
        a = tmp == k ? a + 1 : a - 1;
        if (a < 0) k = tmp, a = 1;
    }
    printf("%d", k);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/mxdh/p/10212229.html