1. 程式人生 > 其它 >P4823 [TJOI2013]拯救小矮人

P4823 [TJOI2013]拯救小矮人

發現無論選擇哪些逃跑的小矮人,讓他們按逃跑能力從小到大逃走肯定可行。考慮最終序列互換相鄰兩個小矮人,並且這隻跟自己有關顯然滿足嚴格弱序。

然後就建個存身高的堆,如果某個小矮人出不去且換掉之前身高最大的小矮人就能出去且當前身高小於換掉的身高就反悔,這樣會使得人梯高度增加。

會不會出現換下來若干個小矮人換上去同樣數量的小矮人並且必須是一起換的情況呢?

如果單獨換不優,那去掉這一對肯定不劣啊。

code:

#include<bits/stdc++.h>
using namespace std;
#define For(i,x,y)for(i=x;i<=(y);i++)
struct dwarf
{
	int a,b;
}p[2005];
priority_queue<int>pri;
inline bool cmp(dwarf _,dwarf __)
{
	return _.a+_.b<__.a+__.b;
}
int main()
{
	int n,i,tot=0,h;
	cin>>n;
	For(i,1,n)cin>>p[i].a>>p[i].b,tot+=p[i].a;
	sort(p+1,p+n+1,cmp);
	cin>>h;
	For(i,1,n)
	if(tot+p[i].b>=h)pri.push(p[i].a),tot-=p[i].a;
	else if(!pri.empty()&&pri.top()>p[i].a&&tot+pri.top()+p[i].b>=h)
	{
		tot+=pri.top()-p[i].a;
		pri.pop();
		pri.push(p[i].a);
	}
	cout<<pri.size();
	return 0;
}