题解 CF725D 【Contest Balloons】
这道题可以用排序 + 堆的方式解答。
可以想到一种贪心策略:每次放飞一个花费气球最少的队伍,即 \(\min{w-t+1}\) 。
这个我们用小根堆来实现。
然后因为排名是按照气球数量 t 来决定的,所以要先排名,把气球多的队伍放前面,然后逐一放飞直到再也无力放飞为止。
因为有可能存在放飞一个队伍之后自己排名反而被后面的队伍 KO ,所以必须在处理的时候更新答案。
#include<bits/stdc++.h>
#define int long long
#define pi pair<int,int>//懒得用结构体了
#define F first
#define S second
using namespace std;
priority_queue<int,vector<int>,greater<int> > q;//STL大法好
pi te[300005];
signed main() {
int n,t,w;
cin>>n>>t>>w;
for(int i=2; i<=n; i++) {
int x,y;
cin>>x>>y;
te[i]=make_pair(x,y);
}
sort(te+2,te+n+1);//排序(此处是从小到大)
//第一个输入的本队,所以不用排序
int i=n,rank=0x3f3f3f3f;//所以i要从n开始到2
while(1) {
for(; i>=2&&te[i].F>t; i--)//把比自己优秀的入堆
q.push(te[i].S-te[i].F+1);
rank=min(rank,(long long)q.size()+1);
if(q.size()&&t>=q.top()) {
t-=q.top();//付出代价
q.pop();//拜拜您内
} else {//当无力迫害或已经rk1的时候退出
cout<<rank;
break;
}
}
return 0;
}
任何一个伟大的计划,都有一个微不足道的开始