BZOJ3709 [PA2014]Bohater

Description:

在一款电脑游戏中,你需要打败n只怪物(从1到n编号)。为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i]点生命值。任何时候你的生命值都不能降到0(或0以下)。请问是否存在一种打怪顺序,使得你可以打完这n只怪物而不死掉

Analysis:

貪心,先打好的怪物(能給自己加血的),再打壞的怪物(減血的)。
排序時:好的按照掉血量遞增,壞的按照增血量遞減。
鏡像?
你離AC只差一個 long long Orz。。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N =  100100;
struct monster{
	int id,d,a,fetag;
	bool operator < (const monster & p) const {
		if(fetag == p.fetag) {
			return (fetag ? (d < p.d) : (a > p.a));
		}
		return fetag > p.fetag;
	}
}m[N];
long long n,z;
bool C()
{
	for(int i = 1;i <= n;++i)
	{
		z -= m[i].d;
		if(z <= 0){
			return false;
		}
		z += m[i].a;
	}
	return true;
}
int main()
{
	while(scanf("%d%lld",&n,&z) != EOF)
	{
		for(int i = 1;i <= n;++i)
		{
			scanf("%d%d",&m[i].d,&m[i].a);
			m[i].id = i;
			m[i].fetag = (m[i].a - m[i].d > 0);
		}
		sort(m+1,m+1+n);	
		if(C()){
			printf("TAK\n");
			for(int i = 1;i <= n;++i) printf("%d%c",m[i].id,i == n ? '\n':' ');
		}
		else{
			printf("NIE\n");
		}
	}
	return 0;
}

posted @ 2019-08-20 19:00  Zforw  阅读(39)  评论(0编辑  收藏  举报