[TC13761]Mutalisk

题目大意:

有\(n(n\le20)\)个坏人,第\(i\)个坏人的血量为\(A_i(A_i\le60)\)。你可以每次攻击\(3\)个坏人,并分别造成\(9\)点、\(3\)点、\(1\)点伤害。问最少需要多少次攻击使得所有坏人血量都\(\le0\)。

思路:

二分+DP。

\(f_{i,j,k}\)表示前\(i\)个坏人,还有\(j\)次扣\(9\)点血的机会、\(k\)次扣\(3\)点血的机会,最多还能有几次扣\(1\)点血的机会。

源代码:

#include<vector>
#include<cstring>
class Mutalisk {
private:
static constexpr int N=21,M=101;
int n,a[N],f[N][M][M];
void upd(int &a,const int &b) {
a=std::max(a,b);
}
bool check(const int &m) {
memset(f,-1,sizeof f);
f[0][m][m]=m;
for(register int i=1;i<=n;i++) {
for(register int j=0;(j-1)*9<=a[i]&&j<=m;j++) {
for(register int k=0;(j-1)*9+(k-1)*3<=a[i]&&j+k<=m;k++) {
const int l=std::max(a[i]-j*9-k*3,0);
if(j+k+l>m) continue;
for(register int a=j;a<=m;a++) {
for(register int b=k;b<=m;b++) {
upd(f[i][a-j][b-k],f[i-1][a][b]-l);
}
}
}
}
}
for(register int i=0;i<=m;i++) {
for(register int j=0;j<=m;j++) {
if(f[n][i][j]!=-1) return true;
}
}
return false;
}
public:
int minimalAttacks(std::vector<int> x) {
n=x.size();
for(register int i=1;i<=n;i++) {
a[i]=x[i-1];
}
int l=1,r=100;
while(l<=r) {
const int mid=(l+r)>>1;
if(check(mid)) {
r=mid-1;
} else {
l=mid+1;
}
}
return r+1;
}
};

[TC13761]Mutalisk的更多相关文章

  1. P3727 曼哈顿计划E

    点分治+SG函数还真是令人意外的组合啊 思路 这道题看到找一条满足条件的链,想到点分治 看到博弈,想到SG函数 然后就变成一道SG函数+点分治的题了 然后1e9的SG函数怎么搞?当然是打表了 然后各种 ...

  2. [Luogu3727]曼哈顿计划E

    luogu 题意(简化版) 给你一棵树,每个点上有一个\(SG\)值,问你是否存在一条路径使得\(SG\)异或和为\(0\). sol 可以当做每个点的稳定值就是这个点上的石子数量. 很显然我们只需要 ...

  3. Luogu P3727 曼哈顿计划E 点分治+hash

    题目: P3727曼哈顿计划E 分析: 大长题面容易给人一种不可做的错觉,但是这题考的知识点都是我们熟悉的. 稍加分析我们可以得到,我们可以把每个点当成一个单独的游戏,如果k=1,就是简单的nim游戏 ...

  4. Topcoder 658 650 point

    Topcoder 658 div2 500 加强版 不过给了<=20,暴力肯定不行. 然后想DP方程,先二分可能需要的最大次数mid; 然后根据 mid 构造 DP方程. 假设x[i]需要 x个 ...

随机推荐

  1. service注入到action中

    service注入到action中 之前本人每次要获得service都是在action自己通过WebApplicationContext的getBean获得的,一直在spring中只配置到了servi ...

  2. 阿里云ECS使用cloudfs4oss挂载OSS

    cloudfs4oss可以帮我们将OSS直接挂载到ECS上,就像一个目录一样方便访问.使用方法: 1.安装配置环境: yum install libcurl libcurl-devel openssl ...

  3. bzoj千题计划260:bzoj2940: [Poi2000]条纹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2940 SG 博弈入门推荐张一飞的<由感性认识到理性认识 ——透析一类搏弈游戏的解答过程> ...

  4. Java入门系列(九)Java API

    String,StringBuilder,StringBuffer三者的区别 1.首先说运行速度,或者说是执行速度 在这方面运行速度快慢为:StringBuilder > StringBuffe ...

  5. 你真的理解js的赋值语句么

    之前谢亮兄和我一起讨论的一个问题: var a = {}; a.x = a = 3; a 的值是什么. 其实当执行赋值语句的时候,js 的 = 左侧不是原始变量地址,而是一个新值.怎么理解这句话呢? ...

  6. 从零开始编写自己的JavaScript框架(二)

    2. 数据绑定 2.1 数据绑定的原理 数据绑定是一种很便捷的特性,一些RIA框架带有双向绑定功能,比如Flex和Silverlight,当某个数据发生变更时,所绑定的界面元素也发生变更,当界面元素的 ...

  7. Maven 环境的配置

    Maven 环境的配置 现在Java新架构的不断出现,例如Struts,Spring,Hibernate等,项目的配置文件的增多,给开发人员带来很大麻烦.在实际的开发当中,Myeclipse中的pro ...

  8. Anaconda+django写出第一个web app(六)

    今天学习如何写一个注册用户的界面. 上一节的导航栏中我们修改了导航栏右侧的文字为register并将路径设置为/register,内容如下: <li><a href="/r ...

  9. mybatis输入输出映射——(五)

    0.#{}与${}区别 #{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?. <!-- 根据id查询用户信息 --> < ...

  10. CodeSmith的基础模版类(CodeSmith help中的内容)

    基础模版类类型描述: Batch      OutputFileCodeTemplate  模版通过继承此类能够在生成过程中把他们的输出保存到文件中 ScriptError    在脚本执行中出现一个 ...