“Shopee杯” e起来编程暨武汉大学2020年大学生程序设计大赛决赛(重现赛)A--A Simple Problem about election(模拟)

地址:https://ac.nowcoder.com/acm/contest/5523/A

     题意:刚开始没读懂。。。题意就是给出n个人,每个人m张票。第一个数是本人得的票数。除了本人以外,所有人都投过了票,现在他要把m张票投完,怎么投才能使自己的排名更靠前。由于他的名字关系,同样的票数,他要排在最后。

     解析:先投给自己一张(规定了只能投自己一票)。然后先投比他大的,因为比他大的票数再多,也影响不到自己的排名了。投完比他大的,如果还有余票,投比他小的而且和他差值>1的,这样也不会影响到他的排名。最后如果还有余票,就投给比他少而且差值<=1的了。投完了排个序,找到第一个等于本人票数的位置输出即可。

#include<iostream>
#include<cstring>
#include<map>
#include<cstdlib>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
ll a[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        a[1]++;
        int md=a[1];
        int ans=m-1;
        for(int i=2;i<=n;i++)
        {
            if(ans==0)
                break;
            if((a[i]>=md))
            {
                a[i]++;
                ans--;
            }
        }
        if(ans>0)
        {
            for(int i=2;i<=n;i++)
            {
                if(ans==0)
                    break;
                if(md-a[i]>1)
                {
                    a[i]++;
                    ans--;
                }
            }
            if(ans>0)
            {
                for(int i=2;i<=n;i++)
                {
                    
                    if((a[i]<md)&&(md-a[i])<=1)
                    {
                        a[i]++;
                        ans--;
                    }if(ans==0)
                        break;
                }
            }
        }
        sort(a+1,a+1+n);
        for(int i=1;i<=n;i++)
        {
            if(a[i]==md)
            {
                cout<<n-i+1<<endl;break;
            }
        }
    }
}
原文地址:https://www.cnblogs.com/liyexin/p/12782698.html