CF1783C题解

· · 题解

题目大意

你和其他 n 个选手将参加一项竞赛,每两名选手间会进行一场比赛,此时与你无关的比赛已经比完,从第 1 到第 n 名选手的胜场数分别为从 0n-1n 个整数,你需要同这 n 名选手进行比赛。

对于第 i 名选手,你需要至少 a_i 分钟来准备与其的比赛才能击败他,你的总准备时间为 m 分钟。

现在请你求出按照胜场数排名后你的最高名次,注意这时如果我们没有选择击败一名对手那么他的胜场数会加 1

tips:

如果 3 名选手各 5 胜,1 名选手各 3 胜,2 名选手各 1 胜,那么前 3 名选手将获得第 1 名,第 4 名选手获得第 4 名,最后 2 名选手获得第 5 名。

基本思路

代码实现

以下为赛时代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+10;
struct mem{
    int id;
    int sum;
}pr[N];
bool cmp(mem x,mem y)
{
    return x.sum<y.sum;
}
int a[N],vis[N];
int n,m;
int T;
signed main(void)
{
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            pr[i].id=i;
            pr[i].sum=a[i];
            vis[i]=0;
        }
        sort(pr+1,pr+n+1,cmp);
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            if(m>=pr[i].sum)
            {
                ans++;
                m-=pr[i].sum;
                vis[pr[i].id]=1;
            }
        }
        int last=ans;
        int sum=n-ans+1;
        if((vis[ans+1]||m>=(a[ans+1]-pr[last].sum))&&sum>1)--sum;
        cout<<sum<<endl;
    }
    return 0;
}