我们把怪分成两类,打完了了能回血的和打完了不能回血的,然后分开打。
对于能回血的,我们先打攻击力低的,因为如果先打一个攻击力高的显然不一定能直接打过,所以先打一些攻击力低的回回血。
对于不能回血的,我们先打回血多的,因为如果能打完我们最后的血量是确定的,所以逆序来看相当于每次丢掉打怪回的血再加上打怪耗的血,这就和前面一样了。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=100005; 6 struct a 7 { 8 int id; 9 long long atk,hpp; 10 }mon1[N],mon2[N]; 11 long long hp,t1,t2; 12 int n,c1,c2,outp[N]; 13 bool cmp1(a x,a y) 14 { 15 return x.atk==y.atk?x.hpp>y.hpp:x.atk<y.atk; 16 } 17 bool cmp2(a x,a y) 18 { 19 return x.hpp==y.hpp?x.atk<y.atk:x.hpp>y.hpp; 20 } 21 int main () 22 { 23 scanf("%d%lld",&n,&hp); 24 for(int i=1;i<=n;i++) 25 { 26 scanf("%lld%lld",&t1,&t2); 27 if(t1<t2) mon1[++c1].atk=t1,mon1[c1].hpp=t2,mon1[c1].id=i; 28 else mon2[++c2].atk=t1,mon2[c2].hpp=t2,mon2[c2].id=i; 29 } 30 sort(mon1+1,mon1+1+c1,cmp1),sort(mon2+1,mon2+1+c2,cmp2); 31 for(int i=1;i<=c1;i++) 32 { 33 if(hp<=mon1[i].atk) printf("NIE"),exit(0); 34 hp+=mon1[i].hpp-mon1[i].atk,outp[++outp[0]]=mon1[i].id; 35 } 36 for(int i=1;i<=c2;i++) 37 { 38 if(hp<=mon2[i].atk) printf("NIE"),exit(0); 39 hp+=mon2[i].hpp-mon2[i].atk,outp[++outp[0]]=mon2[i].id; 40 } 41 printf("TAK\n"); 42 for(int i=1;i<=n;i++) printf("%d ",outp[i]); 43 return 0; 44 } 45