题解 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;
}
原文地址:https://www.cnblogs.com/ahawzlc/p/12599583.html