[BZOJ2964]Boss单挑战
题目描述
某\(RPG\)游戏中,最后一战是主角单挑\(Boss\),将其简化后如下:
主角的气血值上限为\(HP\),魔法值上限为\(MP\),愤怒值上限为\(SP\);\(Boss\)仅有气血值,其上限为\(M\)。
现在共有\(N\)回合,每回合都是主角先行动,主角可做如下选择之一:
普通攻击:减少对方\(X\)的气血值,并增加自身\(DSP\)的愤怒值。(不超过上限)
法术攻击:共有\(N1\)种法术,第\(i\)种消耗\(B_i\)的魔法值,减少对方\(Y_i\)的气血值。(使用时要保证\(MP\)不小于\(B_i\))
特技攻击:共有\(N2\)种特技,第\(i\)种消耗\(C_i\)的愤怒值,减少对方\(Z_i\)的气血值。(使用时要保证\(SP\)不小于\(C_i\))
使用\(HP\)药水:增加自身\(DHP\)的气血值。(不超过上限)
使用\(MP\)药水:增加自身\(DMP\)的魔法值。(不超过上限)
之后\(Boss\)会攻击主角,在第\(i\)回合减少主角\(A_i\)的气血值。
刚开始时气血值,魔法值,愤怒值都是满的。当气血值小于等于\({0}\)时死亡。
如果主角能在这\(N\)个回合内杀死\(Boss\),那么先输出“\(Yes\)”,之后在同一行输出最早能在第几回合杀死\(Boss\)。(用一个空格隔开)
如果主角一定会被\(Boss\)杀死,那么输出“\(No\)”。
其它情况,输出“\(Tie\)”。
Input
输入的第一行包含一个整数\(T\),为测试数据组数。
接下来\(T\)部分,每部分按如下规则输入:
第一行九个整数\(N,M,HP,MP,SP,DHP,DMP,DSP,X\)。
第二行\(N\)个整数\(A_i\)。
第三行第一个整数\(N_1\),接下来包含\(N_1\)对整数\(B_i,Y_i\)。
第四行第一个整数\(N_2\),接下来包含\(N_2\)对整数\(C_i,Z_i\)。
对于第一个样例,主角的策略是:第一回合法术攻击,第二回合使用\(HP\)药水,第三回合特技攻击,第四回合普通攻击。
对于\(10\%\)的数据:\(N≤10,N1=N2=0\)。
对于\(30\%\)的数据:\(N≤10,N1=N2=1\)。
对于\(60\%\)的数据:\(N≤100,M≤10000,HP,MP,SP≤70\)。
对于\(100\%\)的数据:\(1≤N≤1000,1≤M≤1000000,1≤HP,MP,SP≤1000,N1,N2≤10,DHP,A_i≤HP,DMP,B_i≤MP\),\(DSP,C_i≤SP,X,Y_i,Z_i≤10000,1≤T≤10\)
Output
输出共包含\(T\)行,每行依次对应输出一个答案。
Sample Input
2
5 100 100 100 100 50 50 50 20
50 50 30 30 30
1 100 40
1 100 40
5 100 100 100 100 50 50 50 10
50 50 30 30 30
1 100 40
1 100 40
Sample Output
Yes 4
Tie
很显然是一道\(DP\)题,但由于状态数以及转移方式太多了,导致我们无法直接\(DP\)。
那就要考虑是否能将这些分开来考虑,它们之间是否有严格的约束关系
我们可以发现,在对战中,魔法攻击和特效攻击只与总回合数有关。
那我们就把这两个变量分开来进行类似于背包的\(DP\),最后在把血量放到背包里进行\(DP\)即可。
\(dp[i][j]\)表示前\(i\)个回合,血量为\(j\)能攻击的回合数。
若某一时刻的回合数达到了击杀最小回合数就可以击杀了。
\(dpm[i][j]\)表示\(i\)个回合,魔法值剩余\(j\)造成的最大伤害。
\(dps[i][j]\)表示\(i\)个回合,愤怒值剩余\(j\)造成的最大伤害,注意,愤怒值补充时会造成伤害。
\(Fmp[i]\)表示\(i\)个回合造成的最大魔法伤害。
\(Fsp[i]\)表示\(i\)个回合造成的最大特殊伤害。
代码如下
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define u64 unsigned long long
#define reg register
#define Raed Read
#define debug(x) cerr<<#x<<" = "<<x<<endl;
#define rep(a,b,c) for(reg int a=(b),a##_end_=(c); a<=a##_end_; ++a)
#define ret(a,b,c) for(reg int a=(b),a##_end_=(c); a<a##_end_; ++a)
#define drep(a,b,c) for(reg int a=(b),a##_end_=(c); a>=a##_end_; --a)
#define erep(i,G,x) for(reg int i=(G).Head[x]; i; i=(G).Nxt[i])
inline int Read() {
int res = 0, f = 1;
char c;
while (c = getchar(), c < 48 || c > 57)if (c == '-')f = 0;
do res = (res << 3) + (res << 1) + (c ^ 48);
while (c = getchar(), c >= 48 && c <= 57);
return f ? res : -res;
}
template<class T>inline bool Min(T &a, T const&b) {
return a > b ? a = b, 1 : 0;
}
template<class T>inline bool Max(T &a, T const&b) {
return a < b ? a = b, 1 : 0;
}
const int N = 1e3+5, M = 1e3+5, mod = 1e9 + 9;
bool MOP1;
int n,m,hp,mp,sp,dhp,dmp,dsp,x,n1,n2,A[N],b[N],c[N],bb[N],cc[N];
struct T3100 {
int dp[N][M],Fmp[M],Fsp[M],dpm[N][M],dps[N][M];
inline void solve(void) {
rep(i,1,n)rep(j,0,mp)dpm[i][j]=0;
rep(i,1,n)rep(j,0,sp)dps[i][j]=0;
rep(i,0,n)Fsp[i]=Fmp[i]=0;
rep(i,0,n) {
rep(j,0,mp)Max(Fmp[i],dpm[i][j]);
rep(j,0,mp) {
Max(dpm[i+1][min(j+dmp,mp)],dpm[i][j]);
rep(k,1,n1)if(b[k]<=j)Max(dpm[i+1][j-b[k]],dpm[i][j]+bb[k]);
}
}
rep(i,0,n) {
rep(j,0,sp)Max(Fsp[i],dps[i][j]);
rep(j,0,sp) {
Max(dps[i+1][min(j+dsp,sp)],dps[i][j]+x);
rep(k,1,n2) if(c[k]<=j)Max(dps[i+1][j-c[k]],dps[i][j]+cc[k]);
}
}
int Ans=n+n;
rep(i,0,n)rep(j,0,n)if(Fsp[i]+Fmp[j]>=m)Min(Ans,i+j);
memset(dp,-63,sizeof dp);
dp[1][hp]=1;
rep(i,1,n) {
rep(j,1,hp) {
if(dp[i][j]>=Ans) {
printf("Yes %d\n",(int)i);
return;
}
if(A[i]<min(j+dhp,hp))Max(dp[i+1][min(j+dhp,hp)-A[i]],dp[i][j]);
if(A[i]<j)Max(dp[i+1][j-A[i]],dp[i][j]+1);
}
}
rep(i,1,hp)if(dp[n+1][i]>=0) {
puts("Tie");
return;
}
puts("No");
}
} P100;
bool MOP2;
inline void _main(void) {
int T=Read();
while(T--) {
n=Read(),m=Read(),hp=Read(),mp=Read(),sp=Read(),dhp=Raed(),dmp=Read(),dsp=Raed(),x=Read();
rep(i,1,n)A[i]=Read();
n1=Read();
rep(i,1,n1)b[i]=Read(),bb[i]=Read();
n2=Read();
rep(i,1,n2)c[i]=Raed(),cc[i]=Read();
P100.solve();
}
}
signed main() {
#define offline1
#ifdef offline
freopen("boss.in", "r", stdin);
freopen("boss.out", "w", stdout);
_main();
fclose(stdin);
fclose(stdout);
#else
_main();
#endif
return 0;
}
[BZOJ2964]Boss单挑战的更多相关文章
- Codevs 2006=BZOJ 2964 Boss单挑战
2964: Boss单挑战 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 266 Solved: 120[Submit][Status][Discu ...
- [BZOJ 2964] Boss单挑战
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2964 Algorithm: 一道很新颖的背包问题 此题每个状态要维护的量巨多,而转移方式 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 浅谈游戏中BOSS设计的思路
对于大多数游戏来说,BOSS在其设计上都有着不可替代的作用,也是玩家印象最为深刻的一部分.近期自己也有在做BOSS的设计工作,有一些心得想要分享一下: 1.明确BOSS的设计目的 在设计之初,我们一定 ...
- Netty 接受请求过程源码分析 (基于4.1.23)
前言 在前文中,我们分析了服务器是如何启动的.而服务器启动后肯定是要接受客户端请求并返回客户端想要的信息的,否则要你服务器干啥子呢?所以,我们今天就分析分析 Netty 在启动之后是如何接受客户端请求 ...
- NOIP赛前集训备忘录(含每日总结)(日更?。。。)
NOIP赛前集训备忘录(含每日考试总结) 标签: 有用的东西~(≧▽≦)/~啦啦啦 阅读体验:https://zybuluo.com/Junlier/note/1279194 考试每日总结(这个东西是 ...
- Aizu 2249Road Construction 单源最短路变形《挑战程序设计竞赛》模板题
King Mercer is the king of ACM kingdom. There are one capital and some cities in his kingdom. Amazin ...
- lintcode 落单的数(位操作)
题目1 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 链接:http://www.lintcode.com/zh-cn/problem/single ...
- 单表60亿记录等大数据场景的MySQL优化和运维之道
此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...
随机推荐
- XML的树结构与语法规则
㈠概念 什么是 XML? ⑴XML 指可扩展标记语言(EXtensible Markup Language) ⑵XML 是一种标记语言,很类似 HTML ⑶XML 的设计宗旨是传输数据,而非显示数据 ...
- luoguP1034 矩形覆盖 x
P1034 矩形覆盖 题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4( ...
- THUSC 2017 游记
Day0 早上在家里整理东西. 下午坐飞机去北京.(怎么又去北京,上周刚去的北京) 一开始飞机爬升的时候太无聊就睡着了.醒了以后就开始吃东西.吐槽一句:厦航的飞机就是好啊.上面的点心也比上次海航的好吃 ...
- Mybatis 结果映射下划线转驼峰
mybatis 结果映射下划线转驼峰 Spring Boot 配置: #下划线转驼峰 mybatis.configuration.map-underscore-to-camel-case=true m ...
- ajax报告申请添加
function reportApplyAddFun(){ $("#dlg").dialog("open").dialog("center" ...
- 剑指offer:把一个支付算转化为整数
1:首先,根据课本上的程序,是这样的: #include "stdafx.h" #include "iostream" using namespace std; ...
- 【Introduction】R语言入门关键小结
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- 字典的常见操作<二>
<1>len() 测量字典中,键值对的个数 <2>keys 返回一个包含字典所有KEY的列表 <3>values 返回一个包含字典所有value的列表 <4& ...
- python之注释的分类
<1> 单行注释 以#开头,#右边的所有东西当做说明,而不是真正要执行的程序,起辅助说明作用 # 我是注释,可以在里写一些功能说明之类的哦 print('hello world') < ...
- Python数据分析中Groupby用法之通过字典或Series进行分组
在数据分析中有时候需要自己定义分组规则 这里简单介绍一下用一个字典实现分组 people=DataFrame( np.random.randn(5,5), columns=['a','b','c',' ...