[noip模拟题]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 \leqslant N \leqslant 4$
对于50% 的数据,$1 \leqslant N \leqslant 20$
对于100% 的数据,$20 \leqslant P, Q \leqslant 200$, $1 \leqslant N \leqslant 100$, $1 \leqslant h_{i} \leqslant 200$, $1 \leqslant g_{i} \leqslant 10^{6}$
输出
输出包含一个整数W,代表LGTB 最多能获得的金钱
样例
样例输入样例输出
20 60 3
80 100
80 200
120 300
500
4
假如我们要得到第$i$个士兵的收益,我们可以贪心地让塔打小兵尽量多的次数,然后让LGTB去补刀。当然这样不一定一次能打死,所以需要在补刀之前还需打上几次。
所以用$f[i][j]$表示当前考虑到第$i$个士兵时(前面的士兵已经被消灭了),当前积攒了$j$次攻击机会时的最大收益,
第一种操作是不管这个小兵,那么直接让塔把它打死,那么就可以得到一些攻击机会。
第二种操作是在塔把它打残后补刀,这样会消耗一些攻击机会,同时会得到一些收益。
Code
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
ifstream fin("thd.in");
ofstream fout("thd.out");
typedef class xb{
public:
int money; //钱数
int health; //生命值
int kill;
int pkill;
}xb;
int p,q,n;
xb *xbs;
int f[][];
istream& operator >>(istream& in, xb& x){
in>>x.health>>x.money;
}
int main(){
fin>>p>>q>>n;
xbs = new xb[(const int)(n + )];
for(int i = ; i <= n; i++){
fin>>xbs[i];
xbs[i].kill = ( xbs[i].health - )/q; //塔把士兵i打成残血的次数
xbs[i].pkill = ( xbs[i].health - xbs[i].kill * q - )/p + ; //塔把士兵打成残血后,玩家打死士兵的次数
}
for(int i = ;i <= n;i++){ //f数组初始化
for(int j =; j <= ;j++){
f[i][j] = -;
}
}
f[][] = ;
for(int i = ; i <= n;i++){
for(int j = ;j <= ;j++){
f[i][j + xbs[i].kill + ] = max(f[i - ][j], f[i][j + xbs[i].kill + ]);
if(j >= xbs[i].pkill - xbs[i].kill){
f[i][j - (xbs[i].pkill - xbs[i].kill)] = max(f[i - ][j] +
xbs[i].money, f[i][j - (xbs[i].pkill - xbs[i].kill)]);
}
}
}
int maxv = f[n][];
for(int i = ;i <= ;i++)
maxv = max(f[n][i], maxv);
fout<<maxv;
return ;
}
[noip模拟题]LGTB 玩THD的更多相关文章
- 神奇的NOIP模拟赛 T3 LGTB 玩THD
LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...
- [DP] LGTB 玩THD (复杂状态DP)
LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...
- 神奇的NOIP模拟赛 T1 LGTB 玩扫雷
LGTB 玩扫雷 在一个n m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示).LGTB 想在每个空地上写下它周围8 个方向相邻的格子中有几个雷.请帮助他输出写了之后的棋盘 ...
- NOIP模(ka)拟(chang)测试30 考试报告
应得分:300 实得分:210 毒瘤卡常出题人,卡掉90分! T1 Return 开个副本数组sort一下,unique去重就可以啦.时间复杂度$ O(nlog2(n)) $ T2 One 其实就是约 ...
- NOIP simulation
NOIP 模拟赛Day 1题目名称LGTB 玩扫雷LGTB 学分块LGTB 打THD英文代号mine divide thd时限1 秒1 秒1 秒输入文件mine.in divide.in thd.in ...
- 有趣的线段树模板合集(线段树,最短/长路,单调栈,线段树合并,线段树分裂,树上差分,Tarjan-LCA,势能线段树,李超线段树)
线段树分裂 以某个键值为中点将线段树分裂成左右两部分,应该类似Treap的分裂吧(我菜不会Treap).一般应用于区间排序. 方法很简单,就是把分裂之后的两棵树的重复的\(\log\)个节点新建出来, ...
- matlab第一个小应用
今天安装了matlab,以前还是上线性代数的时候,老师让用过,以及水了一次数模的时候玩了一下.以前太年轻,总觉得这个用处不大虽然别人一直强调这个神器... 到了自己要用的时候才会意识到.大家可能也都听 ...
- Yali7月集训Contest2 T1 Cube 题解
题目链接: 连我们都只有纸质题目...话说雅礼集训都是这样的吗... 大意 0维基本图形是一个点 1维基本图形是一条线段 2维基本图形是一个正方形 3维基本图形是一个正方体 4维基本图形是... 求\ ...
- MAC安裝《Genymotion Android模擬器》大玩Android APP (神魔之塔)
链接地址:http://www.minwt.com/mac/10083.html/comment-page-2 MAC» 智慧型裝罝» Android | 2014/02/12 Android是一個開 ...
随机推荐
- 获取linux工具命令源码
总结: 通过先通过which找到命令路径path rpm -qf path 获取源码名称n rpm -qi n 获取源码地址 [root@d mongoexport]# rpm --helpUs ...
- an upstream response is buffered to a temporary file
an upstream response is buffered to a temporary file
- array string mysql IN LIKE
$ids = $_POST['ids']; $str = implode(',',$ids); $str = '('.$str.')'; $db_region->region_del($str) ...
- Master Boot Record
https://en.wikipedia.org/wiki/Master_boot_record https://zh.wikipedia.org/wiki/主引导记录 A master boot r ...
- 2018/04/17 每日一个Linux命令 之 tar
10天没有更新这个每日学习 linux 了,因为实在很忙,晚上还要看会其他知识. 但是也不应该给自己找理由,还是应该每天的坚持下去 -- tar 用于在 linux 解压缩/文件 这个命令下面的参数非 ...
- java实现从服务端下载文件
这边用一个简单的servlet实现java从服务端下载文件的操作 写一个servlet: <servlet> <servlet-name>DownloadServlet< ...
- mysql 数据表操作 存储引擎介绍
一 什么是存储引擎? 存储引擎就是表的类型. mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制 ...
- lua源代码学习(一)lua的c api外围实现
工作后,整个人已经比較松懈了.尽管一直在看lua的源代码.可是一直是比較零碎的时间,没有系统的整理,所以还是收获不多.由于近期工作也不是非常忙了,就想整理下lua的源代码学习的笔记.加深下印象,并分享 ...
- Jedis 对 Redis 的操作详解
1. JedisUtil2. 键操作3. 字符串操作4. 字节串4. 整数和浮点数5. 列表6. 集合(Set)7. 散列8. 排序sort 本篇主要阐述Jedis对redis的五大类型的操作:字符串 ...
- Scala集合类详解
对scala中的集合类虽然有使用,但是一直处于一知半解的状态.尤其是与java中各种集合类的混合使用,虽然用过很多次,但是一直也没有做比较深入的了解与分析.正好趁着最近项目的需要,加上稍微有点时间,特 ...