题目描述

某\(RPG\)游戏中,最后一战是主角单挑\(Boss\),将其简化后如下:

主角的气血值上限为\(HP\),魔法值上限为\(MP\),愤怒值上限为\(SP\);\(Boss\)仅有气血值,其上限为\(M\)。

现在共有\(N\)回合,每回合都是主角先行动,主角可做如下选择之一:

  1. 普通攻击:减少对方\(X\)的气血值,并增加自身\(DSP\)的愤怒值。(不超过上限)

  2. 法术攻击:共有\(N1\)种法术,第\(i\)种消耗\(B_i\)的魔法值,减少对方\(Y_i\)的气血值。(使用时要保证\(MP\)不小于\(B_i\))

  3. 特技攻击:共有\(N2\)种特技,第\(i\)种消耗\(C_i\)的愤怒值,减少对方\(Z_i\)的气血值。(使用时要保证\(SP\)不小于\(C_i\))

  4. 使用\(HP\)药水:增加自身\(DHP\)的气血值。(不超过上限)

  5. 使用\(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单挑战的更多相关文章

  1. Codevs 2006=BZOJ 2964 Boss单挑战

    2964: Boss单挑战 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 266  Solved: 120[Submit][Status][Discu ...

  2. [BZOJ 2964] Boss单挑战

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2964 Algorithm: 一道很新颖的背包问题 此题每个状态要维护的量巨多,而转移方式 ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. 浅谈游戏中BOSS设计的思路

    对于大多数游戏来说,BOSS在其设计上都有着不可替代的作用,也是玩家印象最为深刻的一部分.近期自己也有在做BOSS的设计工作,有一些心得想要分享一下: 1.明确BOSS的设计目的 在设计之初,我们一定 ...

  5. Netty 接受请求过程源码分析 (基于4.1.23)

    前言 在前文中,我们分析了服务器是如何启动的.而服务器启动后肯定是要接受客户端请求并返回客户端想要的信息的,否则要你服务器干啥子呢?所以,我们今天就分析分析 Netty 在启动之后是如何接受客户端请求 ...

  6. NOIP赛前集训备忘录(含每日总结)(日更?。。。)

    NOIP赛前集训备忘录(含每日考试总结) 标签: 有用的东西~(≧▽≦)/~啦啦啦 阅读体验:https://zybuluo.com/Junlier/note/1279194 考试每日总结(这个东西是 ...

  7. Aizu 2249Road Construction 单源最短路变形《挑战程序设计竞赛》模板题

    King Mercer is the king of ACM kingdom. There are one capital and some cities in his kingdom. Amazin ...

  8. lintcode 落单的数(位操作)

    题目1 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 链接:http://www.lintcode.com/zh-cn/problem/single ...

  9. 单表60亿记录等大数据场景的MySQL优化和运维之道

    此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...

随机推荐

  1. Redis 集群规范

    什么是 Redis 集群??Redis 集群是一个分布式(distributed).容错(fault-tolerant)的 Redis 实现,集群可以使用的功能是普通单机 Redis 所能使用的功能的 ...

  2. Word:图片压缩

    造冰箱的大熊猫,本文适用于Microsoft Word 2007@cnblogs 2018/12/1 图片插入Word文档后,可以通过“裁剪”功能只显示图片的部分区域.虽然文档中显示的图片区域变小了, ...

  3. K8S容器探针

    容器探针 探针是由 kubelet对容器执行的定期诊断.要执行诊断, kubelet 调用由容器实现的    Handler .有三种类型的处理程序:   ExecAction :在容器内执行指定命令 ...

  4. apache的httpclient进行http的交互处理

    使用apache的httpclient进行http的交互处理已经很长时间了,而httpclient实例则使用了http连接池,想必大家也没有关心过连接池的管理.事实上,通过分析httpclient源码 ...

  5. C++入门经典-例5.20-右值引用传递参数

    1:使用字面值(如1.3.15f.true),或者表达式等临时变量作为函数实参传递时,按左值引用传递参数会被编译器阻止.而进行值传递时,将产生一个和参数同等大小的副本.C++11提供了右值引用传递参数 ...

  6. LeetCode124----二叉树中最大路径和

    给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不需要经过根节点. 示例 1: 输入: [1,2,3] 1 / \ 2 ...

  7. java 开发工具包 jdk 64位 jdk-8u221-windows-x64.exe 迅雷下载

    迅雷下载链接(迅雷新建任务,复制链接进去): https://download.oracle.com/otn/java/jdk/8u221-b11/230deb18db3e4014bb8e3e8324 ...

  8. SpringBoot整合Mybatis,并实现事务控制

    SpringBoot整合Mybatis,并实现事务控制 1. 在pom文件里添加相关maven文件 <parent> <groupId>org.springframework. ...

  9. loadrunner事务判断常用方法

    //判断关联到的字符串是否为空 if (strlen(lr_eval_string("{param}")) == 0); //判断关联的字符串是否跟期望的值相同 if(strcmp ...

  10. 可滚动UIStackView 竖向居中 / 横向右对齐

    重点: 在scroll view和stack view之间加一个UIView. 竖向居中Tutorial: https://stackoverflow.com/questions/50766400/c ...