题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;//结束
}