题目描述
优秀
(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;
}