把怪分成两类看:

一、回血>损血 则若先杀损血少的再杀损血多的,则为当前这一步提供了更高的可能性。因为血量是单增的,所以尽量用较少的血量去干♂耗血较少的怪物。

二、回血<损血 则若先杀回血多的再杀回血少的,则为下一步提供了更高的可能性。当前这一步的可能性也没有减少,因为即使回血多的损血很多,但是由于此时血量已经是单减的了,所以若此时无法杀掉损血多的,将来也不能。

ORZ TimeMachine And ZKY

 #include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
struct Point{ll x,y;int p;Point(const ll &a,const ll &b,const int &c){x=a;y=b;p=c;}Point(){}};
Point a[],b[];
int en1,en2,n;
bool cmp1(const Point &a,const Point &b){return a.x<b.x;}
bool cmp2(const Point &a,const Point &b){return a.y>b.y;}
ll hp,x,y;
int main()
{
cin>>n>>hp;
for(int i=;i<=n;i++)
{
cin>>x>>y;
if(y>x) a[++en1]=Point(x,y,i);
else b[++en2]=Point(x,y,i);
}
sort(a+,a+en1+,cmp1);
sort(b+,b+en2+,cmp2);
for(int i=;i<=en1;i++)
{
hp-=a[i].x;
if(hp<=) {puts("NIE"); return ;}
hp+=a[i].y;
}
for(int i=;i<=en2;i++)
{
hp-=b[i].x;
if(hp<=) {puts("NIE"); return ;}
hp+=b[i].y;
}
puts("TAK");
for(int i=;i<=en1;i++) printf("%d ",a[i].p);
for(int i=;i<=en2;i++) printf("%d ",b[i].p);
return ;
}
05-11 17:43