优秀 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;
}
posted @ 2019-01-03 07:46  面向大海  阅读(432)  评论(0编辑  收藏  举报