5.11返校测试T2

题2:选票统计(vote.cpp/in/out)


【问题描述】

有k(k<maxlongint)名候选者,有n(n<=10000)人参加了投票,与以往不同的是,这次所有得票数超过n/4的人都是优胜者。请你统计收到的n张选票,找出符合条件的优胜者(可能不止一个),请使用线性算法,因为参加投票的人也许会很多(比如所有中国人),并不只针对本题。

【输入格式】

第一行一个整数n。
第二行有n个正整数,每个数字代表一张选票所选的人的编号。

【输出格式】

每行一个正整数,为优胜者的编号,由小到大。
如果没人获胜,则输出“No such person.”。

【样例输入】

8
5 2 3 6 2 5 2 7

【样例输出】

2

【提示】

优胜者为2号。


下面是这个题的思路QWQ

将所有的选票进行从小到大排序(快排解决),然后将数组进行扫描,如果数组前后两个数不同(或第一个数),将该选手的号码进行记录,并将该选手的票数+1,如果数组中前后两数重复,即有很多人投此选手,将该选手的票数+1。

扫描完毕后,所有被pick的选手及其选票就会一一对应。

然后扫描一遍新的数组(存选票数量的数组),如果有选手所得票数超过了投票人数的1/4,即该选手为优胜者,输出对应选手的号码。如果没有优胜者,输出No such person.


下面是ac题解

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
long long n,a[10005],b[10005]={},c[10005];
/*a数组用于存储全部的选票,b数组用于存储有选票选手的选票数,c数组用于存储有选票选手的编号*/
bool flag=0;//判断有无优胜者
int main() 
{
//	freopen("vote.in","r",stdin);
//	freopen("vote.out","w",stdout);
	a[0]=-1;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	sort(a+1,a+n+1);//将选票进行快速排序
	long long j=0;
	for(int i=1;i<=n;i++)
	{
		if(a[i]!=a[i-1])//前后两数不同的情况
		{
			j++;
			c[j]=a[i];
			b[j]++;
		}
		if(a[i]==a[i-1])//前后两数相同的情况
        {
            b[j]++;
        }
	}
	for(int i=1;i<=j;i++)
	{
		if(b[i]>n/4)//判断有无优胜者
		{
			flag=1;//有优胜者,flag赋值1
			cout<<c[i]<<endl;
		}
	}
	if(flag==0) //没有优胜者的情况
		cout<<"No such person."<<endl;
	return 0;//结束
}
原文地址:https://www.cnblogs.com/Kyriech-Francis/p/Answer_20200511_T2.html