[题解]?LGTB 玩THD

  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 }
时间: 2024-12-16 14:47:17

[题解]?LGTB 玩THD的相关文章

[DP] LGTB 玩THD (复杂状态DP)

LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻击任意一个活着的小兵,对其造成P 点伤害,如果小兵的血量低于1 点,小兵死亡,他得到金钱.他也可以不攻击任何小兵.每一秒LGTB 攻击完毕之后,塔会攻击距离塔最近的一个活着的小兵,对其造成Q 点伤害,如果小兵的血量低于1 点,小兵死亡,LGTB 不会得到金钱现在LGTB 想知道,在他选择最优策略时,

day1 LGTB玩THD

先贴出原题: LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻击任意一个活着的小兵,对其造成P 点伤害,如果小兵的血量低于1 点,小兵死亡,他得到金钱.他也可以不攻击任何小兵.每一秒LGTB 攻击完毕之后,塔会攻击距离塔最近的一个活着的小兵,对其造成Q 点伤害,如果小兵的血量低于1 点,小兵死亡,LGTB 不会得到金钱现在LGTB 想知道,在他选择最优策略时,他能得

day1 LGTB玩扫雷

先附上原题: 在一个n m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示).LGTB 想在每个空地上写下它周围8 个方向相邻的格子中有几个雷.请帮助他输出写了之后的棋盘输入输入第一行包含两个整数n, m 代表棋盘大小接下来n 行,每行m 个字符,代表棋盘1 n,m 1000输出输出包含n 行,每行m 个字符,代表LGTB 写了数字之后的棋盘O(∩_∩)O哈!这道题,毫无算法可言就是了,纯暴力循环...那么,下面贴出代码: #include<cstdio> #incl

[无主题] 三题

1.LGTB 玩扫雷 题意 在一个n m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示).LGTB 想在每个空地上写下它周围8 个方向相邻的格子中有几个雷.请帮助他输出写了之后的棋盘 输入输入第一行包含两个整数n, m 代表棋盘大小接下来n 行,每行m 个字符,代表棋盘1≤n,m≥1000 输出输出包含n 行,每行m 个字符,代表LGTB 写了数字之后的棋盘 样例 样例输入3 3*.*...*.* 样例输出*2*242*2* 提示:暴力 1 #include<iost

[铁一中OI模拟赛]2017.8.20 Day2

T1 LGTB 玩扫雷 题目链接 思考: 纯模拟题,没啥说的. #include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) int n,m,map[1005][1005]; char s[233]; int fx[]={0,0,-1,-1,-1,0,1,1,1},fy[]={0,-1,-1,0,1,1,1,0,-1}; int main(){ //freopen(&

2017福建省赛 FZU2272~2283

1.FZU2272 Frog 传送门:http://acm.fzu.edu.cn/problem.php?pid=2272 题意:鸡兔同笼通解 题解:解一个方程组直接输出就行 代码如下: #include <map> #include <set> #include <cmath> #include <ctime> #include <stack> #include <queue> #include <cstdio> #in

AGC006做题小记

比赛链接:AGC006 C.Rabbit Exercise 题意 有 n 只兔子,一开始第 i 只兔子位于 x[i] .有 m 次操作,第 i 次操作给定 ai, 表示让第 a[i] 只兔子等概率选择 a[i] - 1 或 a[i] + 1 中的一只兔子,跳到它相对于那只兔子的对称点. 要求你输出重复这 m 个操作 k 次之后, 每只兔子坐标的期望. 3 ≤ N, M ≤ 100000 1 ≤ K ≤ 1018 题解 800分比1500分难系列 x 关于 y 对称做一次跳跃会跳到 2y - x

小凸玩密室题解

小凸玩密室题解 恶心题啊-- 开始连题意都看不懂, 看了会题解的题意简化,结果理解错了题意,说多了都是泪啊- 首先说说题意吧: 点亮一盏灯后,只有点亮完子树内所有灯后才能点其他灯,而且点亮的灯要求要连通. -->下一步一定点两个儿子之一,先点完这个儿子的子树再点另一个儿子. 然而,上一盏灯点什么十分不好求,贡献算不出(一个点子树内有多个层数相同的子孙). 但是,我们可以通过上一盏灯算下一盏灯的贡献啊(每个点只有一个层数一定的父辈). 所以点完这个点后,我们只有两种情况: 1.我们点完这个点后构成

题解【[USACO05NOV]奶牛玩杂技】

\[ \texttt{Description} \] 有 \(n\) 头牛,每头牛都有自己的体重 \(W_i\) 和力量 \(S_i\) . 将这 \(n\) 头牛摞在一起,每头牛的压扁指数定义为:压在该牛上面的牛的体重之和 \(-\) 该牛力量 . 您需要找到一种摞牛方案,使得压扁指数最大的牛的压扁指数最小. 求这个压扁指数. \[ \texttt{Solution} \] 微扰(邻项交换)证明贪心好题. 考虑任意一个摞牛方案,设该摞牛方案中,从顶端往底端数的第 \(i\) 头牛的体重为 \(