题目描述

某\(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. 在linux安装php

    去www.php.net找下载最新的版本 http://www.php.net/downloads.php 下载解压 # wget  http://cn2.php.net/distributions/ ...

  2. 「SCOI2015」小凸玩矩阵

    题目链接 问题分析 题目给了充足的暗示,我们只需要二分答案然后跑匈牙利即可.要相信匈牙利的速度 参考程序 #include <bits/stdc++.h> using namespace ...

  3. MiracleSnow网页设计HTML5+CSS3+JS全套视频教程

    终于把这套课程讲完了,虽然时间隔了很长,但也算有始有终了,这是在YY讲课中我自己录的,讲了网页设计的基础,这也是我第一次给那么多人讲课,讲的不好多多包涵. 前几次视频和课件是分开的,后几次都打包在一起 ...

  4. php正则表达式的学习

    真的发现什么都需要这个 所以还是来把它学了吧 正则表达式的基本知识汇总 行定位符(^与$) 行定位符是用来描述字符串的边界.“$”表示行结尾“^”表示行开始如"^de",表示以de ...

  5. Eclipse的JSON文件报错解决

    有时候我们后端老哥不想写HTML,偷懒去下载个前端页面,结果里面的JSON文件老报错 虽然可以正常运行,但红X看起来就是不爽,怎么解决呢 这是因为Eclipse认为JSON文件不需要注释,所以报的编译 ...

  6. Docker入门-Dockerfile的使用

    使用Dockerfile定制镜像 镜像的定制实际上就是定制每一层所添加的配置.文件.我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,这个脚本就是Dockerfile. Dockerfile ...

  7. Java缓存技术有哪些

    我们用ehcache在本地,分布式用redis和memcache,各有各的好处,现在企业都是应用很多种中间件供俺们码农选择.

  8. EPPlus生成Excel表格(只支持2007及以上)

    主要来源: https://www.cnblogs.com/rumeng/p/3785748.html http://epplus.codeplex.com/ FileInfo newFile = n ...

  9. linux上的syslog

    在centos上,syslog其实是rsyslog,对应的配置文件为/etc/rsyslog.conf,守护进程为:/etc/rsyslog.d --------------------------- ...

  10. iOS 的 Gif 渲染

    关于gif的展示,有些项目中很少用到,所以有的人对于这方面了解不是很多 下面介绍几种展示gif的方法,希望大家可以用得上,有更好的方法欢迎评论区留言 一,展示本地的gif,使用的SDWebImage里 ...