Luogu P1156 垃圾陷阱 【dp】By cellur925
这题...看上去浓浓的背包气息...但是并不好设计状态啊emmm。
我们考虑可能成为状态的量:高度、血量、时间、物品。看数据范围也猜到应该大概是个二维dp了w。
正确的状态设计之一:设$f[i][j]$表示用到第$i$个物品,当前高度为$j$的最大血量。为什么用这个状态,因为写转移比较好写==
每个物品一定在它扔下的那时就被处理的,对于每个物品,每一时间我们有两种决策:堆起来和吃掉。
- 堆起来:首先在这个时刻奶牛一定是活着的(血量>=0),而且之前的高度一定大于等于0我们要注意检验它是否活着是要把两个相邻物品的时间差减去(这段时间没有进食)。那么便有转移:
$f[i][j]$=$max${$f[i-1][j-rub[i].h]$-$rub[i].tim$+$rub[i-1].tim$}
- 吃掉它:同上,这时奶牛也必须活着。
$f[i][j]$=$max${$f[i-1][j]$-$rub[i].tim$+$rub[i-1].tim$+$rub[i].val$}
我们的dp部分就结束了。
之后就是赋初值的细节,开始$f$数组是负无穷的,且有$f[0][0]=10$。
在处理答案方面,当我们dp时遇到一个与井同高的时刻,我们就可以判断它是否能作为答案。
如果无解,那么答案就由$f[i][j]$+$rub[i].tim$来寻找最大值。
Code
#include<cstdio>
#include<algorithm>
#include<cstring> using namespace std; int well_h,n,ans;
bool flag;
int f[][];
struct rubbish{
int tim,val,h;
}rub[]; bool cmp(rubbish a,rubbish b)
{
return a.tim<b.tim;
} int main()
{
scanf("%d%d",&well_h,&n);
for(int i=;i<=n;i++)
scanf("%d%d%d",&rub[i].tim,&rub[i].val,&rub[i].h);
sort(rub+,rub++n,cmp);
memset(f,,sizeof(f));
f[][]=;
for(int i=;i<=n;i++)
for(int j=;j<=well_h;j++)
{
if(f[i-][j]-rub[i].tim+rub[i-].tim>=)
f[i][j]=max(f[i][j],f[i-][j]-rub[i].tim+rub[i-].tim+rub[i].val);
if(f[i-][j-rub[i].h]-(rub[i].tim-rub[i-].tim)>=&&j-rub[i].h>=)
{
f[i][j]=max(f[i][j],f[i-][j-rub[i].h]-(rub[i].tim-rub[i-].tim));
if(j==well_h){printf("%d",rub[i].tim),flag=;return ;}
}
}
if(!flag)
for(int i=;i<=n;i++)
for(int j=;j<=well_h;j++)
ans=max(ans,f[i][j]+rub[i].tim);
printf("%d\n",ans);
return ;
}
细节:dp题目注意从0开始枚举的情况。
Luogu P1156 垃圾陷阱 【dp】By cellur925的更多相关文章
- Luogu P1156 垃圾陷阱 DP
f[i][j]表示在第i个垃圾,高度为j的最大生命值 转移分三部分: 如果j>=当前垃圾的高度,且两个垃圾间的时间小于等于上一个状态f[i-1][j-a[i].v]的生命值,则可以垫高度 如果j ...
- 【luogu P1156 垃圾陷阱】 题解
题目链接:https://www.luogu.org/problemnew/show/P1156 设\(dp[i][j]\)表示前i堆到达高度j时的所活最长时间 那么一旦到当前状态能到达满足的时间和高 ...
- P1156 垃圾陷阱 DP
题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2 \le D \le 100)D(2≤D≤100)英尺. 卡门 ...
- [題解]luogu P1156 垃圾陷阱
前言:[數據刪除] 來源:題解 不發題面了 首先我们来分析题目,“每个垃圾都可以用来吃或堆放”,浓浓的透露出一个背包气息.我们可以类比背包问题的放或不放.于是dp[i][j]dp[i][j]dp[i] ...
- [Luogu] P1156 垃圾陷阱
题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2≤D≤100)英尺. 卡门想把垃圾堆起来,等到堆得与井同样高时 ...
- 洛谷P1156 垃圾陷阱 dp
正解:dp 解题报告: 这儿是传送门! 话说最近怎么神仙们都开始狂刷dp,,,感觉今天写了好多dp的题解的样子?(也就三四道其实× 然后这题,首先看到要么吃要么堆起来就会想到01背包趴?然后就考虑设方 ...
- 【洛谷】P1156 垃圾陷阱【DP】
P1156 垃圾陷阱 题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2≤D≤100)英尺. 卡门想把垃圾堆起来 ...
- 洛谷 P1156 垃圾陷阱
2016-05-31 09:54:03 题目链接 :洛谷 P1156 垃圾陷阱 题目大意: 奶牛掉坑里了,给定坑的深度和方块的个数,每个方块都可以垫脚或者吃掉维持生命(初始为10) 若可以出来,求奶牛 ...
- 【题解】P1156垃圾陷阱
[题解]P1156 垃圾陷阱 乍看此题,我们感觉状态很多,很复杂. 遇到这类型条件比较多的\(dp\),我们不要首先考虑全部设出来,而是要看到这些状态的本质.而在这道题目中,时间和高度就是关键. 考虑 ...
随机推荐
- Variable 'bop' is uninitialized when captured by block
代码: - (void)doTest { NSBlockOperation * bop = [NSBlockOperation blockOperationWithBlock:^{ if (!bop. ...
- 线程池ThreadPoolExecutor分析
线程池.线程池是什么,说究竟,线程池是处理多线程的一种形式,管理线程的创建,任务的运行,避免了无限创建新的线程带来的资源消耗,可以提高应用的性能.非常多相关操作都是离不开的线程池的,比方android ...
- 阿里云serverMySQL无法连接问题解决纪实
作者:fbysss QQ:溜酒酒吧酒吧吾散 blog:blog.csdn.net/fbysss 声明:本文由fbysss原创,转载请注明出处 背景: 在调试程序的时候,发现数据库訪问相关的环节出现错误 ...
- openwrt gstreamer实例学习笔记(六. gstreamer Pads及其功能)
一:概述 如我们在Elements一章中看到的那样,Pads是element对外的接口.数据流从一个element的source pad到另一个element的sink pad.pads的功能(cap ...
- (白书训练计划)UVa 11572 Unique Snowflakes(窗体滑动法)
题目地址:UVa 11572 这样的方法曾经接触过,定义两个指针,不断从左向右滑动,推断指针内的是否符合要求. 这个题为了能高速推断是否有这个数,能够用STL中的set. 代码例如以下: #inclu ...
- 链式mapreduce
在hadoop 中一个Job中可以按顺序运行多个mapper对数据进行前期的处理,再进行reduce,经reduce后的结果可经个经多个按顺序执行的mapper进行后期的处理,这样的Job是不会保存中 ...
- 如何解决Windows的端口占用问题?
已知某应用在启动时会创建服务套接字,并将其绑定至端口8888,然而端口8888已被占用,如何解除占用? 以下为解决方案: 在cmd中运行netstat -ano|findstr 8888,其中的参数8 ...
- Introduce Null Object
今天继续总结<重构>这本书中的一个重构手法,Introduce Null Object.写这个手法是因为它确实很巧妙,在实际编程中经常会遇到这种情况,前人总结出来了这么一个经典的手法,当然 ...
- mysql优化----explain的列分析
sql语句优化: : sql语句的时间花在哪儿? 答: 等待时间 , 执行时间. 等待时间:看是不是被锁住了,那就不是语句层面了是服务端层面了,看连接数内存. 执行时间:到底取出多少行,一次性取出1万 ...
- BigDecimal快速使用
double类型最多支持16位有效数字,且最大值只支持10^308次方,大一点的数字会变为科学计数法,小数精度不够等有一系列不方便的问题: 引进BigDecimal解决此类麻烦,弊端,BigDecim ...