题目描述

某\(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. AcWing:139. 回文子串的最大长度(字符串Hash + 前缀和 + 后缀和 + 二分)

    如果一个字符串正着读和倒着读是一样的,则称它是回文的. 给定一个长度为N的字符串S,求他的最长回文子串的长度是多少. 输入格式 输入将包含最多30个测试用例,每个测试用例占一行,以最多1000000个 ...

  2. Apicloud_(项目)网上书城03_拓展模块实现

    Apicloud_(项目)网上书城01_前端页面开发 传送门 Apicloud_(项目)网上书城02_后端数据获取 传送门 Apicloud_(项目)网上书城03_拓展模块实现 传送门 实现商品详情页 ...

  3. char、varchar 哪种的搜索效率高

    在MySQL 中char 和 varchar 都是存储字符串的,区别在于char有固定的长度,而varchar属于可变长的字符类型.char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于 ...

  4. 微信小程序 — 速学速查笔记

    1. 配置 配置全解析 project.config.json ( 项目配置文件 ) { // 文件描述 "description": "项目配置文件", // ...

  5. jpa repostiory

    JpaRepository的查询   image.png   image.png Spring Data JPA框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find.findBy.re ...

  6. scrum例会报告+燃尽图02

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9955 一.小组情况 组长:贺敬文组员:彭思雨 王志文 位军营 徐丽君队名 ...

  7. BOSCH汽车工程手册————自适应巡航速度控制ACC

    驾驶员通过自动速度控制器操纵键,将汽车行驶速度控制在预设的期望速度上. ACC系统则在自动速度控制的基础上检测本车到前面行驶汽车的距离以及相对速度,以及其他车道上的信息. 利用这些数据就能控制两车之间 ...

  8. CSS二级菜单

    0.需求:当鼠标hover到按钮上时,出现下拉菜单导航条. 1.问题拆解: (1)HTML应该如何组织比较方便合理 因为题中要求下拉菜单位于按钮的正下方,可以使用列表<li>中嵌套无序列表 ...

  9. 三步解决IDEA系列开发工具 RubyMine、IntelliJ IDEA 卡顿问题

    近日有小伙伴跟我反映说自己的开发工具很卡,有没有什么解决方案?答案是当然有啦!接下来看看怎么设置! 1.打开RubyMine,或IDEA,上边工具栏选择Help,下拉选择Edit Custom VM ...

  10. flutter 隐藏返回按钮 自定义返回按钮

    自定义返回按钮 //改变颜色 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( leading: BackBu ...