[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的设计目的 在设计之初,我们一定 ...
随机推荐
- CVPR2014 Objectness 源码转换(完整版) VS2012 X64 –>win32
一.版本转换 1.将源码中vs2012 X64版本转换为vs2012 win32版本. 2.源码下载及其相关资料下载http://mmcheng.net/zh/bing/ 3.需要下载源码(Pape ...
- 使用Spring AOP实现读写分离(MySql实现主从复制)
1. 背景 我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案,其中一个是主库,负责写入数据,我们称之为:写库: 其它都是从库,负责读 ...
- 数学:乘法逆元-拓展GCD
乘法逆元应用在组合数学取模问题中,这里给出的实现不见得好用 给出拓展GCD算法: 扩展欧几里得算法是指对于两个数a,b 一定能找到x,y(均为整数,但不满足一定是正数) 满足x*a+y*b=gcd(a ...
- Freewheel Tech interview
1.聊背景.. 2.聊项目..然饿我的项目是webvr..基本面试官很少会了解这个..应该再多做实习多做些项目.. 3.浏览器输入网址后到页面呈现出来的过程 4.缓存机制, 浏览器如何判断一个图片有没 ...
- docker push 镜像到本地仓库
root@ubuntu:# uname -a Linux ubuntu --generic #-Ubuntu SMP Mon Feb :: UTC x86_64 x86_64 x86_64 GNU/L ...
- Python用户登陆
#!/usr/bin/env python # _*_ coding:UTF-8 _*_ # __auth__:Dahlhin import sys userinfo = r'userinfo.txt ...
- 小苏的Shell编程笔记之六--Shell中的函数
http://xiaosu.blog.51cto.com/2914416/531247 Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以 ...
- AWS Ubuntu部署EMQTT的小坑
Redis身份认证中的 is_superuser 表示不查检用户密码和ACL规则 如果是Ubuntu,集群设置节点名须改为:ubuntu@私有Ip,安全组最好相互开放所有端口 如果使用了ELB,EMQ ...
- 原型 Boolean String Math Date知识点
原型 1.定义 每一个对象都有原型 原型仍然是一个对象 模拟实现面向对象的继承性 2.原型链 对象的原型还有原型 对象除了可以使用自有属性还可以继承原型上的属性 3.获取原型 对象.__proto__ ...
- springmvc对于前台date类型注意点
springmvc,可以自动将数据注入到: “name”值相同,便注入,比如String Integer 还有我们自定义的bean,比如User. 但是date类型的数据,如果前台传的是用" ...