题目链接https://www.luogu.org/problemnew/show/CF725D
考虑这样一个贪心,当我们在某时已经是第一名时就不用再送人上天了,否则每次就送最容易上天的队伍上天,然后更新名次,更新答案,将上天的队伍踢出,可以用优先队列实现
当前的名次等于得分比我们大的总队伍个数+1
#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=500010;
struct re{
ll t,w;
}team[maxn];
priority_queue<ll,vector<ll>,greater<ll> >q;
int n;ll ans=1<<30;
int min(int a,int b)
{
return a<b?a:b;
}
bool cmp(re a,re b)
{
if(a.t==b.t){
return a.w<b.w;
}
return a.t>b.t;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%I64d%I64d",&team[i].t,&team[i].w);
}
sort(team+2,team+1+n,cmp);
int id=2;
while(1){
while(id<=n&&team[id].t>team[1].t)
{
q.push(team[id].w-team[id].t+1);
id++;
}
ans=min(ans,q.size()+1);
if(q.empty()||team[1].t<q.top()){
break;
}
team[1].t-=q.top();
q.pop();
}
printf("%d\n",ans);
return 0;
}