解题: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

猜你喜欢

转载自www.cnblogs.com/ydnhaha/p/9809081.html
今日推荐