1. 程式人生 > >解題:PA 2014 Bohater

解題:PA 2014 Bohater

題面

我們把怪分成兩類,打完了了能回血的和打完了不能回血的,然後分開打。

對於能回血的,我們先打攻擊力低的,因為如果先打一個攻擊力高的顯然不一定能直接打過,所以先打一些攻擊力低的回回血。

對於不能回血的,我們先打回血多的,因為如果能打完我們最後的血量是確定的,所以逆序來看相當於每次丟掉打怪回的血再加上打怪耗的血,這就和前面一樣了。

 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
View Code