码迷,mamicode.com
首页 > 其他好文 > 详细

【贪心】bzoj 3709:[PA2014]Bohater

时间:2015-10-08 14:36:00      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

3709: [PA2014]Bohater

Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special Judge
Submit: 653  Solved: 220
[Submit][Status][Discuss]

Description

在一款电脑游戏中,你需要打败n只怪物(从1到n编号)。为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i]点生命值。任何时候你的生命值都不能降到0(或0以下)。请问是否存在一种打怪顺序,使得你可以打完这n只怪物而不死掉

Input

第一行两个整数n,z(1<=n,z<=100000),分别表示怪物的数量和你的初始生命值。
接下来n行,每行两个整数d[i],a[i](0<=d[i],a[i]<=100000)

Output

第一行为TAK(是)或NIE(否),表示是否存在这样的顺序。
如果第一行为TAK,则第二行为空格隔开的1~n的排列,表示合法的顺序。如果答案有很多,你可以输出其中任意一个。

Sample Input

3 5
3 1
4 8
8 3

Sample Output

TAK
2 3 1

  很容易想到先把打完怪吃掉血以后加血的怪先干掉
  而且要按伤害从小到大慢慢打(等于你有一个初始血量,只要你现在血量大于这种怪的血量你就能获得(给的血-掉的血)的血量)
  然后剩下的一部分直接按药从大到小排序。。
  把伤害看做血瓶,把血瓶看做伤害,从最终的状态往回倒流,那么你就会发现,这和第一种是同一个情况了。。。这思路真是厉害,想了半天奇怪的贪心没贪过去Orz
  
技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<algorithm>
 5 
 6 #define maxn 100001
 7 
 8 using namespace std;
 9 
10 inline long long in()
11 {
12     int x=0;char ch=getchar();
13     while(ch<0||ch>9)ch=getchar();
14     while(ch<=9&&ch>=0)x=x*10+ch-0,ch=getchar();
15     return x;
16 }
17 
18 struct ed{
19     int x,y,id;
20 }a[maxn],b[maxn];
21 
22 int xb[maxn];
23 
24 bool cmp1(const ed A,const ed B)
25 {
26     return A.x<B.x;
27 }
28 
29 bool cmp2(const ed A,const ed B)
30 {
31     return A.y>B.y;
32 }
33 
34 int main()
35 {
36     int n,x,y,cnt1=0,cnt2=0,cnt=0;
37     long long d;
38     n=in(),d=in();
39     for(int i=1;i<=n;i++)
40     {
41         x=in(),y=in();
42         if(x<=y)a[++cnt1].x=x,a[cnt1].y=y,a[cnt1].id=i;
43         else b[++cnt2].x=x,b[cnt2].y=y,b[cnt2].id=i;
44     }
45     sort(1+a,1+a+cnt1,cmp1);
46     sort(1+b,1+b+cnt2,cmp2);
47     for(int i=1;i<=cnt1;i++)
48     {
49         if(d<=a[i].x){printf("NIE");return 0;}
50         d+=a[i].y-a[i].x;
51     }
52     for(int i=1;i<=cnt2;i++)
53     {
54         if(d<=b[i].x){printf("NIE");return 0;}
55         d+=b[i].y-b[i].x;
56     }
57     printf("TAK\n");
58     for(int i=1;i<=cnt1;i++)
59         printf("%d ",a[i].id);
60     for(int j=1;j<=cnt2;j++)
61         printf("%d ",b[j].id);
62     return 0;
63 }
View Code

 

【贪心】bzoj 3709:[PA2014]Bohater

标签:

原文地址:http://www.cnblogs.com/tuigou/p/4860890.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!