• 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;//结束
    }
    
  • 相关阅读:
    流量控制--2.传统的流量控制元素
    流量控制--1.概览
    Opentelemetry Collector的配置和使用
    高德全链路压测——精准控压的建设实践
    高德全链路压测——语料智能化演进之路
    业内首发车道级导航背后——详解高精定位技术演进与场景应用
    浅析云控平台画面传输的视频流方案
    关于卫星定位,你想知道的一切
    Pod容器中安装软件包
    面试应该怎么问问题?
  • 原文地址:https://www.cnblogs.com/Kyriech-Francis/p/Answer_20200511_T2.html
Copyright © 2020-2023  润新知