[BZOJ 2964] Boss单挑战
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2964
Algorithm:
一道很新颖的背包问题
此题每个状态要维护的量巨多,而转移方式也巨多,直接写转移方程明显是不现实的
那要考虑的就是能否将这些量分开考虑,它们间是否有明确的约束关系
可以发现mp和sp的相关操作和在哪一个回合无关,而只与需要的回合总数有关
那么就先DP出fm[i]和fs[i],分别表示用i个回合能用mp与sp打出的最大伤害,可以算出最少要mneed个回合战胜boss
接下来再逐个回合考虑hp问题,用dp[i][j]表示到第i个回合血量为j时能挤出的最大回合数
能挤出mneed个回合则YES,能在第n回合保持不死则输出Tie,否则NO
Code:
#include <bits/stdc++.h> using namespace std; const int MAXN=+;
const int INF=<<; int T,n,m,x,hp,mp,sp,mp_cnt,sp_cnt,dhp,dsp,dmp;
int a[MAXN],ump[MAXN],amp[MAXN],usp[MAXN],asp[MAXN];
int fm[MAXN],gm[MAXN][MAXN],fs[MAXN],gs[MAXN][MAXN],dp[MAXN][MAXN]; void up(int &x,int y){if(x<y) x=y;} void solve()
{
memset(fm,,sizeof(fm));memset(gm,,sizeof(gm));
memset(fs,,sizeof(fs));memset(gs,,sizeof(gs)); cin>>n>>m>>hp>>mp>>sp>>dhp>>dmp>>dsp>>x;
for(int i=;i<=n;i++) cin >> a[i];
cin >> mp_cnt;
for(int i=;i<=mp_cnt;i++) cin >> ump[i] >> amp[i];
cin >> sp_cnt;
for(int i=;i<=sp_cnt;i++) cin >> usp[i] >> asp[i]; for(int i=;i<=n;i++)
{
for(int j=;j<=mp;j++) up(fm[i],gm[i][j]);
if(i==n) break;
for(int j=;j<=mp;j++)
{
up(gm[i+][min(mp,j+dmp)],gm[i][j]);
for(int k=;k<=mp_cnt;k++)
if(j>=ump[k]) up(gm[i+][j-ump[k]],gm[i][j]+amp[k]);
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=sp;j++) up(fs[i],gs[i][j]);
if(i==n) break;
for(int j=;j<=sp;j++)
{
up(gs[i+][min(sp,j+dsp)],gs[i][j]+x);
for(int k=;k<=sp_cnt;k++)
if(j>=usp[k]) up(gs[i+][j-usp[k]],gs[i][j]+asp[k]);
}
} int mneed=INF;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(fm[i]+fs[j]>=m) mneed=min(mneed,i+j); for(int i=;i<MAXN;i++)
for(int j=;j<MAXN;j++)
dp[i][j]=-INF; dp[][hp]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=hp;j++)
if(dp[i][j]>=mneed)
{
cout << "Yes " << i << endl;
return;
}
for(int j=;j<=hp;j++)
{
if(min(hp,j+dhp)>a[i]) up(dp[i+][min(hp,j+dhp)-a[i]],dp[i][j]);
if(j-a[i]>) up(dp[i+][j-a[i]],dp[i][j]+);
}
} for(int i=;i<=hp;i++)
if(dp[n+][i]>=)
{
cout << "Tie" << endl;
return;
}
cout << "No" << endl;
} int main()
{
cin >> T;
while(T--) solve();
return ;
}
Review:
当发现转移状态时要维护的信息过多时,可以查看这些量是否可以分离
先逐个转移,最后再根据较弱的约束将状态加合
注意大小写啊!!
[BZOJ 2964] Boss单挑战的更多相关文章
- Codevs 2006=BZOJ 2964 Boss单挑战
2964: Boss单挑战 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 266 Solved: 120[Submit][Status][Discu ...
- [BZOJ2964]Boss单挑战
题目描述 某\(RPG\)游戏中,最后一战是主角单挑\(Boss\),将其简化后如下: 主角的气血值上限为\(HP\),魔法值上限为\(MP\),愤怒值上限为\(SP\):\(Boss\)仅有气血值, ...
- bzoj P4825 [Hnoi2017]单旋——solution
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的 ...
- BZOJ:4825: [Hnoi2017]单旋
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...
- bzoj 4825: [Hnoi2017]单旋 [lct]
4825: [Hnoi2017]单旋 题意:有趣的spaly hnoi2017刚出来我就去做,当时这题作死用了ett,调了5节课没做出来然后发现好像直接用lct就行了然后弃掉了... md用lct不知 ...
- 【刷题】BZOJ 4825 [Hnoi2017]单旋
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...
- bzoj 4825: [Hnoi2017]单旋【dfs序+线段树+hash】
这个代码已经不是写丑那么简单了--脑子浆糊感觉np++分分钟想暴起打死我--就这还一遍A过了-- 先都读进来hash一下,因为是平衡树所以dfs序直接按照点值来就好 对于每个操作: 1:set维护已插 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 浅谈游戏中BOSS设计的思路
对于大多数游戏来说,BOSS在其设计上都有着不可替代的作用,也是玩家印象最为深刻的一部分.近期自己也有在做BOSS的设计工作,有一些心得想要分享一下: 1.明确BOSS的设计目的 在设计之初,我们一定 ...
随机推荐
- webkit开发,app移动前端知识点
1. viewport:也就是可视区域.对于桌面浏览器,我们都很清楚viewport是什么,就是出去了所有工具栏.状态栏.滚动条等等之后用于看网页的区域,这是真正有效的区域.由于移动设备屏幕宽度不同于 ...
- lvm扩容
111 mkfs -t xfs /dev/sda3 112 pvcreate /dev/sda3 113 vgs 114 vgextend cl /dev/sda3 115 lvscan 116 vg ...
- 一串跟随鼠标的DIV
div跟随鼠标移动的函数: <!DOCTYPE HTML><html><head> <meta charset="utf-8"> & ...
- Spring学习--泛型依赖注入
暂时没有搞懂.
- 入门级:GitHub和Git超超超详细使用教程!
GitHub和Git入门 考虑到大家以前可能对版本控制工具和Linux命令行工具都不了解,我写了一个简单的博客来让大家学会入门使用方法. GitHub的简单使用 第一步 创建GitHub账号 1. 打 ...
- C# 序列化理解 1(转)
序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方. .NET框架提供了两种串行化的方式: ...
- MVC前台获取ViewData的数组中的值
查了一上午资料,找到了一种比较有效的方法 后台控制器:public ActionResult Index() { List<string> colors = new List<str ...
- Gradle体验/第一篇:下装、安装、配置、体验
http://jingyan.baidu.com/article/4d58d541167bc69dd4e9c009.html
- bootstrap row 行间距
<div class="clearfix" style="margin-bottom: 10px;"></div>清除浮动加个margi ...
- 使用Tslib在触摸屏上显示汉字【转】
转自:http://www.latelee.org/embedded-linux/use-tslib-to-display-chinese-character.html 终于到了在触摸屏上显示汉字了, ...