链接:http://acm.hdu.edu.cn/showproblem.php?pid=3646

题意:你有N把武器,每把武器可以对敌人造成一定的伤害(et:攻击力500,敌人血量为200,杀死敌人,攻击力剩余300),一共有K个敌人,你有M次魔法double武器的攻击力(加倍),使用武器是有规则的:武器有两个状态,一个状态为young,一个为old,新的武器状态为young,当你用它杀死一个敌人之后,状态变为old,当状态为young的时候,即使该武器剩余的攻击力不足以杀死当前的敌人,但是可以伤害他一定血量,但是为old的时候,武器攻击力不足以杀死对方,就无法攻击他(比如攻击力为200,敌人血量500,young:敌人减少200,old:敌人血量不减)。使用武器的顺序和杀人的顺序是给定的。问你最多能杀死几个人?

见解:如果没有old,young的话,这是一个水DP,有了这个状态的话,我们不好处理,主要是不知道当前武器的状态是什么,如果加一维表示当前状态的话,那么还得再来一维表示正在挑战第几个敌人,我们可以这样理解状态,dp【i】【j】表示使用完了i把武器,用了j次魔法,一共造成的伤害是多少,转移的时候,二分下现在的伤害就能知道现在在杀第a个人,然后二分再使用一把武器的造成的伤害,能知道挑战到第b个人,如果两个人不是同一个人,那说明我们无法伤害b,那么使用这把武器后我们能造成的伤害就是sum【b】了,最后二分伤害,就可以知道最多杀死几个人了,详细看代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define Max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int maxn = 105;
const int maxm = 100005;
int dp[2][maxn],life[maxm],power[maxn * maxn],N,M,K;
int sum[maxm];
int main()
{int cnt = 0;while(scanf("%d%d%d",&N,&M,&K) && N + M + K){for(int i = 1;i <= N;i ++) scanf("%d",&power[i]);for(int i = 1;i <= K;i ++){scanf("%d",&life[i]);sum[i] = sum[i - 1] + life[i];}int ans = 0;M = min(M,N);memset(dp,0,sizeof(dp));for(int i = 1;i <= N && !ans;i ++){for(int j = 0;j <= M;j ++){int a , b, next_a,next_b;a = upper_bound(sum + 1,sum + 1 + K,dp[(i - 1) & 1][j]) - sum;// now killedif(j){b = upper_bound(sum + 1,sum + 1 + K,dp[(i - 1) & 1][j - 1]) - sum;//now killed j - 1next_b = upper_bound(sum + 1,sum + 1 + K,dp[(i - 1) & 1][j - 1] + (power[i] << 1)) - sum;// use power}next_a = upper_bound(sum + 1,sum + 1 + K,dp[(i - 1) & 1][j] + power[i]) - sum;//not use powerint hurt_a = dp[(i - 1) & 1][j] + power[i],hurt_b ;if(a != next_a) hurt_a = sum[next_a - 1];if(j) hurt_b = dp[(i - 1) & 1][j - 1] + (power[i] << 1);if(j) if(b != next_b) hurt_b = sum[next_b - 1];if(j)dp[i & 1][j] = Max(hurt_a,hurt_b);else dp[i & 1][j] = hurt_a;if(dp[i & 1][j] >= sum[K]){ans = K;break;}}}if(!ans) ans =  upper_bound(sum + 1,sum + 1 + K,dp[N & 1][M]) - sum - 1;printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/yobobobo/archive/2012/10/26/3826806.html

HDU 3646 DP + 二分相关推荐

  1. 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...

  2. LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)

    1. 题目 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现. 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计算最多 ...

  3. 程序员面试金典 - 面试题 17.08. 马戏团人塔(最长上升子序 DP/二分查找)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 二分查找 1. 题目 有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上.出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一 ...

  4. HDU 5928 DP 凸包graham

    给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...

  5. hdu 1171 dp(多重背包)

    View Code //hdu 1171 dp(多重背包)//题意:把所有物品的价值尽量分为相等的两份,不能等分的话 //后面那份可以稍小于前面的 //求出价值总和后,令价值的一半为背包容量,让背包尽 ...

  6. poj 3208 Apocalypse Someday 数位dp+二分答案

    Apocalypse Someday Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 2203   Accepted: 11 ...

  7. poj3208 Apocalypse Someday (数位dp + 二分)

    The number 666 is considered to be the occult "number of the beast" and is a well used num ...

  8. HDU 1025 Constructing Roads In JGShining's Kingdom(DP+二分)

    点我看题目 题意 :两条平行线上分别有两种城市的生存,一条线上是贫穷城市,他们每一座城市都刚好只缺乏一种物资,而另一条线上是富有城市,他们每一座城市刚好只富有一种物资,所以要从富有城市出口到贫穷城市, ...

  9. hdu 1025 Constructing Roads In JGShining's Kingdom(DP + 二分)

    此博客为转发 Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Li ...

最新文章

  1. Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 实践
  2. 阿里云天池 Python训练营Task3: Python基础进阶:从函数到高级魔法方法 学习笔记
  3. eigen冲突 sophus 安装_SLAM-Sophus模板库安装总结
  4. git 还原文件到其他版本_如何在Git中还原旧文件版本
  5. Spring Boot : Bean标签属性
  6. 设计素材模板丨极简风简历模板
  7. Linux协议栈:基于ping流程窥探Linux网络子系统,及常用优化方法
  8. 为checkedListBox赋值并 遍历checkedListBox中选中的值
  9. java高并发 pdf_Java高并发编程详解 PDF 下载
  10. OLED屏显和汉字点阵编码原理
  11. 网页携带参数,将参数通过网址传入到对应的页面输入框内
  12. 联想笔记本电脑连不上wifi,网络适配器显示黄色感叹号,错误代码56
  13. 关于win10自带邮箱绑定163邮箱的设置
  14. 如何学习数字通信FPGA设计
  15. 微信小程序,仓库系统,可以扫描入库查询
  16. 测试小故事48:想当然
  17. mysql 报错Incorrect string value: '\xF0\x9F\x98\x84' 解决方案
  18. php生成字母头像,Identicon:实现根据用户账号生成像素头像 php 版
  19. python 函数修饰器 父类_手把手教你学python第十四讲(函数装饰器,super用法和时间处理)...
  20. 《算法导论》习题5.3-1 ~ 5.3-7

热门文章

  1. python sdk怎么用_如何使用七牛Python SDK写一个同步脚本及使用教程
  2. 解决ubuntu连不上网络,输入ifconfig只显示本地环回问题
  3. 大数据挑战赛(大佬篇)
  4. 什么是野指针和内存泄露?如何避免野指针
  5. 解决Nginx添加openssl模块编译时报错问题
  6. 《网易编程题》疯狂队列
  7. 基于mindspore的口罩检测训练与在线推理
  8. mysql批量提交的优化
  9. 聊聊高并发(二十七)解析java.util.concurrent各个组件(九) 理解ReentrantLock可重入锁
  10. 【LeetCode算法题库】Day5:Roman to Integer Longest Common Prefix 3Sum