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
");
for(int i = 1;i <= n;++i) printf("%d%c",m[i].id,i == n ? '
':' ');
}
else{
printf("NIE
");
}
}
return 0;
}