Aizu 2155 Magic Slayer 背包DP
这是上上次对抗赛的题目了
其实现在发现整个代码从头到尾,都是用了背包,怪我们背包没深入学好。
比赛的时候,聪哥提出的一种思路是,预处理一下,背包出 ALL攻击 和 single攻击的 血量对应的最小花费,其实这些都没什么问题。。。主要是后面的问题,后面为了找到如何使用ALL攻击是最好的,我们是这样处理的,对怪物血量 升序排序,然后枚举,从哪个点开始,该点前面的怪物都用ALL杀死,后面的怪物都用single杀死,因为血高的放在后面多承受几次ALL攻击应该是最优的,这样看起来好像是对的。。也过了样例,就是WA了。。。。其实WA的很明显,我们居然三个人都没想到,刚刚重新敲这道题才发现这个策略大错特错了,我们这样枚举,很明显,没有计算,用了ALL攻击,但是没有杀死怪物的情况,也许这些就是最优解。。我们的策略,要么就不用ALL攻击,用了ALL攻击就一定要把怪物杀死。。。肯定有问题啊。
后来还是参考的别人的比较好的思路,前面的处理是一样的,不过换了一下,背包出 两种攻击 的 花费 对应的 最大攻击,即 下标是 花费,值是攻击力,这样便于后面的处理。
背包完之后,从0开始往上枚举 出 使用ALL的花费情况,然后就得到ALL的攻击总量,再遍历一遍怪物,就可以得到剩余血量用single攻击的花费,全部加起来就是可能的结果,全部枚举完就能求出最优解
刚刚还和聪哥讨论了好久,为什么枚举ALL花费情况就可以得到所有合理的ALL攻击组合,这其实就是利用了背包的特性,即,我给你一个上限,就能帮我求出这个上限中的最优组合,就是利用了背包的特性。。。所以我为什么说这整个题目就是一个背包题,全部都在利用背包的特性。。怪我没有对背包理解透彻,这种隐藏的可以枚举花费,通过背包得到组合情况没有想到。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 110010
using namespace std;
int hp[]; struct weapon{
int c,p;
}all[],sig[];
int dp[][N];
int all_num,sig_num;
int m,n;
void init()
{
all_num=sig_num=;
}
void proc()
{
memset(dp,,sizeof dp);
for (int i=;i<all_num;i++){
for (int j=all[i].c;j<N;j++){
dp[][j]=max(dp[][j],dp[][j-all[i].c]+all[i].p);
}
}
for (int i=;i<sig_num;i++){
for (int j=sig[i].c;j<N;j++){
dp[][j]=max(dp[][j],dp[][j-sig[i].c]+sig[i].p);
}
}
}
int bs(int val)
{
int l=,r=N-,mid;
while (l<r)
{
mid=(l+r)>>;
if (dp[][mid]<val) l=mid+;
else r=mid;
}
return l; }
int main()
{
char ch[],cc[];
int a,b;
while (scanf("%d",&n)){
if (!n) break;
init();
for (int i=;i<n;i++) scanf("%d",&hp[i]);
scanf("%d",&m);
bool flag=false;
for (int i=;i<m;i++){
scanf("%s %d %s %d",ch,&a,cc,&b);
// cout<<a<<" "<<b<<endl;
if (cc[]=='A') all[all_num++]=(weapon){a,b};
if (cc[]=='S') sig[sig_num++]=(weapon){a,b};
if (a== && b>) flag=;
}
if (flag) {puts("");continue;}
proc();
int ans=N*;
for (int i=;i<ans;i++){
int temp=i;
for (int j=;j<n;j++){
temp+=bs(hp[j]-dp[][i]);
}
ans=min(ans,temp);
}
printf("%d\n",ans);
}
return ;
}
Aizu 2155 Magic Slayer 背包DP的更多相关文章
- HDU 5119 Happy Matt Friends (背包DP + 滚动数组)
题目链接:HDU 5119 Problem Description Matt has N friends. They are playing a game together. Each of Matt ...
- Codeforces 922 E Birds (背包dp)被define坑了的一题
网页链接:点击打开链接 Apart from plush toys, Imp is a huge fan of little yellow birds! To summon birds, Imp ne ...
- 背包dp整理
01背包 动态规划是一种高效的算法.在数学和计算机科学中,是一种将复杂问题的分成多个简单的小问题思想 ---- 分而治之.因此我们使用动态规划的时候,原问题必须是重叠的子问题.运用动态规划设计的算法比 ...
- hdu 5534 Partial Tree 背包DP
Partial Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
- HDU 5501 The Highest Mark 背包dp
The Highest Mark Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...
- Codeforces Codeforces Round #319 (Div. 2) B. Modulo Sum 背包dp
B. Modulo Sum Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/577/problem/ ...
- noj [1479] How many (01背包||DP||DFS)
http://ac.nbutoj.com/Problem/view.xhtml?id=1479 [1479] How many 时间限制: 1000 ms 内存限制: 65535 K 问题描述 The ...
- HDU 1011 树形背包(DP) Starship Troopers
题目链接: HDU 1011 树形背包(DP) Starship Troopers 题意: 地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...
- BZOJ 1004: [HNOI2008]Cards( 置换群 + burnside引理 + 背包dp + 乘法逆元 )
题意保证了是一个置换群. 根据burnside引理, 答案为Σc(f) / (M+1). c(f)表示置换f的不动点数, 而题目限制了颜色的数量, 所以还得满足题目, 用背包dp来计算.dp(x,i, ...
随机推荐
- hadoop 第一个 mapreduce 程序(对MapReduce的几种固定代码的理解)
1.2MapReduce 和 HDFS 是如何工作的 MapReduce 其实是两部分,先是 Map 过程,然后是 Reduce 过程.从词频计算来说,假设某个文件块里的一行文字是”Thisis a ...
- 一 Hibernate入门
Hibernate环境搭建 Hibernate的API Hibernate的CRUD EE三层结构: web层 业务逻辑层 持久层 jdbc,DBUTils,Hibernate Hib ...
- hdu 3549 Flow Problem 最大流问题 (模板题)
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- 【转载】Jmeter关联-正则表达式提取器
今天研发同事提供了一个验证token的接口,要验证token的正确性,现在将整个过程做如下记录: 场景:验证token的正确性 原理:首先用户登录成功后,会在Response head ...
- Prometheus Operator 架构【转】
本节讨论 Prometheus Operator 的架构.因为 Prometheus Operator 是基于 Prometheus 的,我们需要先了解一下 Prometheus. Prometheu ...
- 【C】揭秘rand()函数;
原文地址:http://www.cnblogs.com/ngnetboy/archive/2012/11/23/2784078.html 相信只要是程序猿都会知道rand()函数是用来取随机数的一个库 ...
- 05.swoole学习笔记--定时器
<?php //循环执行的定时器 swoole_timer_tick(,function($timer_id){ echo "执行 $timer_id \n"; }); sw ...
- 用Python实现简单的服务器【新手必学】
如何实现服务器... socket接口是实际上是操作系统提供的系统调用.socket的使用并不局限于Python语言,你可以用C或者JAVA来写出同样的socket服务器,而所有语言使用socket的 ...
- git参考
https://github.com/NewLifeX (redis.mq.数据海量查询.分布式任务调度)
- Hadoop数据压缩技术
一.Hadoop数据压缩及其优缺点 1.压缩技术的好处与坏处 好处: 减少存储磁盘空间 降低IO(网络的IO和磁盘的IO) 加快数据在磁盘和网络中的传输速度,从而提高系统的处理速度. 坏处: 由于使用 ...