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

[题解]?LGTB 玩THD

时间:2016-07-15 00:10:30      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

  LGTB 最近在玩一个类似DOTA 的游戏名叫THD
  有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面
每个小兵有一定的血量hi,杀死后有一定的金钱gi
  每一秒,他都可以攻击任意一个活着的小兵,对其造成P 点伤害,如果小兵的血量低于1 点,小兵死亡,他
得到金钱。他也可以不攻击任何小兵。
  每一秒LGTB 攻击完毕之后,塔会攻击距离塔最近的一个活着的小兵,对其造成Q 点伤害,如果小兵的血
量低于1 点,小兵死亡,LGTB 不会得到金钱
  现在LGTB 想知道,在他选择最优策略时,他能得到多少钱。
输入
输入第一行包含3 个整数P, Q, N
接下来N 行,每行包含2 个整数hi, gi
第i 个小兵和塔之间的距离为i
输入的意义如题面所示
对于20% 的数据,1  N  4
对于50% 的数据,1  N  20
对于100% 的数据,20  P,Q  200, 1  N  100, 1  hi  200, 0  gi  106
输出
输出包含一个整数W,代表LGTB 最多能获得的金钱
样例
样例输入样例输出
20 60 3
80 100
80 200
120 300
500
4


 

Code:

 1 #include<iostream>
 2 #include<fstream>
 3 #include<cstring>
 4 using namespace std;
 5 ifstream fin("thd.in");
 6 ofstream fout("thd.out");
 7 typedef class xb{
 8     public:
 9         int money;                                        //钱数 
10         int health;                                        //生命值 
11         int kill;
12         int pkill;
13 }xb;
14 int p,q,n;
15 xb *xbs;
16 int f[101][1001];
17 istream& operator >>(istream& in, xb& x){
18     in>>x.health>>x.money;
19 }
20 int main(){
21     fin>>p>>q>>n;
22     xbs = new xb[(const int)(n + 1)];
23     for(int i = 1; i <= n; i++){
24         fin>>xbs[i];
25         xbs[i].kill = ( xbs[i].health - 1 )/q;                    //塔把士兵i打成残血的次数 
26         xbs[i].pkill = ( xbs[i].health - xbs[i].kill * q - 1)/p + 1;    //塔把士兵打成残血要后,玩家打死士兵的次数 
27     }
28     for(int i = 0;i <= n;i++){                    //f数组初始化 
29         for(int j =0; j <= 1000;j++){
30             f[i][j] = -1000000;
31         }
32     }
33     f[0][1] = 0;                            //f[i][j]表示打第i个士兵在第j秒最高的得到的钱,
34                                             //j同时表示在塔打j个士兵前玩家可以攻击的次数 
35     for(int i = 1; i <= n;i++){
36         for(int j = 0;j <= 1000;j++){
37             f[i][j + xbs[i].kill + 1] = max(f[i - 1][j], f[i][j + xbs[i].kill + 1]);
38             if(j >= xbs[i].pkill - xbs[i].kill){
39                 f[i][j - (xbs[i].pkill - xbs[i].kill)] = max(f[i - 1][j] + 
40                     xbs[i].money, f[i][j - (xbs[i].pkill - xbs[i].kill)]);
41             }
42         }
43     }
44     int maxv = f[n][0];
45     for(int i = 0;i <= 1000;i++)
46         maxv = max(f[n][i], maxv);
47     fout<<maxv;
48     return 0;
49 }


 

[题解]?LGTB 玩THD

标签:

原文地址:http://www.cnblogs.com/yyf0309/p/5671918.html

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