[洛谷P1156][codevs1684]垃圾陷阱
题目大意:一头奶牛掉进了深度为d的坑里,现在有g个垃圾在特定时刻ti扔进来。奶牛可以吃垃圾以获得体力,吃第i个垃圾能获得mi的体力,也可以堆放垃圾以逃生,第i个垃圾高度为hi。当高度≥d时奶牛成功逃生。但当体力值小于0时逃生失败(每一个单位时间耗费一点体力)。
现在奶牛初始体力值为10,问:如果能逃生,最短什么时候;如果不能,最长能活多久?
解题思路:动态规划。
设dp[i][j]表示到第i个垃圾扔下来的时候,已经堆到j的高度时,奶牛剩余的最大体力。则
$dp[i][j]=max(dp[i][j-h[i]]-(t[i]-t[i-1])(当dp[i][j-h[i]]-(t[i]-t[i-1])\geq 0时),dp[i][j]-(t[i]-t[i-1])+m[i](当dp[i][j]-(t[i]-t[i-1])\geq 0时))$。
每次判断dp[i][d]是否≥0,如果是,则t[i]就是答案。
如果dp完后还未得出答案,说明无法逃生,则贪心求出能活的最长时间即可(即扔进来的垃圾全吃了,到饿死为止)。
注意按照投入时刻进行排序。
时间复杂度$O(dg)$。
C++ Code:
#include<cstdio>
#include<cstdarg>
#include<cctype>
#include<algorithm>
#include<cstring>
using namespace std;
int d,n,dp[102][25005];
struct brush{
int t,m,h;
bool operator <(const brush& rhs)const{return t<rhs.t;}
}a[102];
inline int readint(){
char c=getchar();
bool b=false;
for(;!isdigit(c);c=getchar())b=c=='-';
int d=0;
for(;isdigit(c);c=getchar())
d=(d<<3)+(d<<1)+(c^'0');
return b?-d:d;
}
inline void read(int cnt,...){
va_list arg_ptr;
va_start(arg_ptr,cnt);
for(int i=0;i<cnt;++i){
int* p=va_arg(arg_ptr,int*);
*p=readint();
}
}
int main(){
read(2,&d,&n);
for(int i=1;i<=n;++i)read(3,&a[i].t,&a[i].m,&a[i].h);
sort(a+1,a+n+1);
memset(dp,170,sizeof dp);
dp[0][0]=10;
a[0].t=0;
for(int i=1;i<=n;++i){
int tcha=a[i].t-a[i-1].t;
for(int j=0;j<=d;++j){
if(dp[i-1][j]-tcha>=0)
dp[i][j]=max(dp[i][j],dp[i-1][j]-tcha+a[i].m);
if(j>=a[i].h)
if(dp[i-1][j-a[i].h]-tcha>=0)
dp[i][j]=max(dp[i][j],dp[i-1][j-a[i].h]-tcha);
}
if(dp[i][d]>=0){
printf("%d\n",a[i].t);
return 0;
}
}
int hp=10;
for(int i=1;i<=n;++i){
if(hp>=a[i].t)hp+=a[i].m;else{
printf("%d\n",hp);
return 0;
}
}
printf("%d\n",hp);
return 0;
}
[洛谷P1156][codevs1684]垃圾陷阱的更多相关文章
- 洛谷 P1156 垃圾陷阱
2016-05-31 09:54:03 题目链接 :洛谷 P1156 垃圾陷阱 题目大意: 奶牛掉坑里了,给定坑的深度和方块的个数,每个方块都可以垫脚或者吃掉维持生命(初始为10) 若可以出来,求奶牛 ...
- 洛谷——P1156 垃圾陷阱
P1156 垃圾陷阱 题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2 \le D \le 100)D(2≤D ...
- 洛谷 P1156 垃圾陷阱 (01背包拓展)(好题!!)
这真是一道好题目 学到了很多 一开始感觉吃或者不吃会有后效性 然后看到洛谷的题解,直接把这个有后效性的部分当作dp的维度和值 因为这个垃圾可以堆或者不堆,所以这个很像01背包, 但是加了非常多的限制条 ...
- 洛谷P1156 垃圾陷阱[背包DP]
题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想把垃圾堆起来,等到 ...
- 洛谷P1156 垃圾陷阱
动规仍然是难关啊 题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想 ...
- 洛谷P1156 垃圾陷阱【线性dp】
题目:https://www.luogu.org/problemnew/show/P1156 题意: 每一个垃圾投放时间是t,可以堆的高度是h,如果吃掉可以增加的生命值是f. 给定g个垃圾,初始生命值 ...
- 洛谷 P1156 垃圾陷阱 谈论剪枝,非满分
这是一个91分的非dp代码(是我太弱) 剪枝八五个(实际上根本没那么多,主要是上课装逼,没想到他们dp水过去了),不过我的思路与dp不同: 1.层数到达i+1,return 这个必须有 2.当前剩余生 ...
- 洛谷P1156 垃圾陷阱 dp
正解:dp 解题报告: 这儿是传送门! 话说最近怎么神仙们都开始狂刷dp,,,感觉今天写了好多dp的题解的样子?(也就三四道其实× 然后这题,首先看到要么吃要么堆起来就会想到01背包趴?然后就考虑设方 ...
- 洛谷 P1156 垃圾陷阱 题解
题目传送门 dp+排序+01背包 就完事了??? 貌似就是这样的 代码: //dp 排序 01背包 #include<iostream> #include<cstdio> #i ...
随机推荐
- Kettle学习系列之Kettle的起源
不多说,直接上干货! Kettle起源于十年以前,本世纪初.当时啊,ETL工具千姿百态,比较流行的工具有50个左右,ETL框架数量比工具还要多些. 根据这些工具的各自起源和功能可以分为以下4种类型,如 ...
- 优动漫PAINT-超简单灌木教程
超简单灌木教程~零基础神马的都能神还原哦! 优动漫PAINT下载:http://wm.makeding.com/iclk/?zoneid=18597 想要Get到更多有关优动漫的信息包括软件下载,可关 ...
- WebKit.NET-0.5简单应用
最近想用c#做个简单的浏览器工具,但是网站一些内容不支持c#内置的WebBowser控件,于是只能改用其他内核浏览器进行开发,搜索到WebKit.NET这个封装好的浏览器引擎,需求的功能也都有,于是用 ...
- BZOJ 5254 [Fjwc2018]红绿灯 (线段树)
题目大意:一个wly从家走到学校要经过n个红绿灯,绿灯持续时间是$g$,红灯是$r$,所有红绿灯同时变红变绿,交通规则和现实中一样,不能抢红灯,两个红绿灯之间道路的长度是$di$,一共$Q$个询问,求 ...
- 二叉排序树(B-Tree)-c实现
这个二叉排序树写完了,虽然还有些bug,但还是很高兴的. 主要实现二叉排序树的构建.(*表示稍微重要点) 二叉排序树的打印. 二叉排序树的删除. 代码里的三种情况都测了 顺便附送一个简单的中序遍历,递 ...
- 【Henu ACM Round#24 B】Gargari and Bishops
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果写过n皇后问题. 肯定都知道 某个点(i,j)和它在同一条对角线上的点分别是i+j的值和i-j的值相同的点. 然后会发现选择的两 ...
- C# AE 符号选择器
using ESRI.ArcGIS.Display; using ESRI.ArcGIS.DisplayUI private esriTOCControlItem toccItem = esriTOC ...
- cocos2d_android 第一个游戏
依据上一篇文章.创建好cocos2d--android的开发环境 先上效果图 实现该效果的代码: package com.cn.firstgame; import org.cocos2d.layers ...
- 11_HTML5_Local_Storage本地存储
本地存储localStorage是大型cookie,cookie只有4k,
- bzoj1430: 小猴打架(prufer序列)
1430: 小猴打架 题目:传送门 简要题意: n只互不相识的猴子打架,打架之后就两两之间连边(表示已经相互认识),只有不认识(朋友的朋友都是朋友)的两只猴子才会打架.最后所有的猴子都会连成一棵树,也 ...