题目大意:一头奶牛掉进了深度为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]垃圾陷阱的更多相关文章

  1. 洛谷 P1156 垃圾陷阱

    2016-05-31 09:54:03 题目链接 :洛谷 P1156 垃圾陷阱 题目大意: 奶牛掉坑里了,给定坑的深度和方块的个数,每个方块都可以垫脚或者吃掉维持生命(初始为10) 若可以出来,求奶牛 ...

  2. 洛谷——P1156 垃圾陷阱

    P1156 垃圾陷阱 题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2 \le D \le 100)D(2≤D ...

  3. 洛谷 P1156 垃圾陷阱 (01背包拓展)(好题!!)

    这真是一道好题目 学到了很多 一开始感觉吃或者不吃会有后效性 然后看到洛谷的题解,直接把这个有后效性的部分当作dp的维度和值 因为这个垃圾可以堆或者不堆,所以这个很像01背包, 但是加了非常多的限制条 ...

  4. 洛谷P1156 垃圾陷阱[背包DP]

    题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想把垃圾堆起来,等到 ...

  5. 洛谷P1156 垃圾陷阱

    动规仍然是难关啊 题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想 ...

  6. 洛谷P1156 垃圾陷阱【线性dp】

    题目:https://www.luogu.org/problemnew/show/P1156 题意: 每一个垃圾投放时间是t,可以堆的高度是h,如果吃掉可以增加的生命值是f. 给定g个垃圾,初始生命值 ...

  7. 洛谷 P1156 垃圾陷阱 谈论剪枝,非满分

    这是一个91分的非dp代码(是我太弱) 剪枝八五个(实际上根本没那么多,主要是上课装逼,没想到他们dp水过去了),不过我的思路与dp不同: 1.层数到达i+1,return 这个必须有 2.当前剩余生 ...

  8. 洛谷P1156 垃圾陷阱 dp

    正解:dp 解题报告: 这儿是传送门! 话说最近怎么神仙们都开始狂刷dp,,,感觉今天写了好多dp的题解的样子?(也就三四道其实× 然后这题,首先看到要么吃要么堆起来就会想到01背包趴?然后就考虑设方 ...

  9. 洛谷 P1156 垃圾陷阱 题解

    题目传送门 dp+排序+01背包 就完事了??? 貌似就是这样的 代码: //dp 排序 01背包 #include<iostream> #include<cstdio> #i ...

随机推荐

  1. 51nod 2020 排序相减(暴力解法)

    题目: 代码: #include <bits\stdc++.h> using namespace std; int trim(int x){ ]; ;i < ; i++){ a[i] ...

  2. AOJ 0118: Property Distribution (简单DFS)

    题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0118 题意:给定一个矩阵,同类字符相连的为一个块,问总共有几个块. 输入 ...

  3. CF 287(div 2) B Amr and Pins

    解题思路:一开始自己想的是找出每一次旋转所得到的圆心轨迹,将想要旋转到的点代入该圆心轨迹的方程,如果相等,则跳出循环,如果不相等,则接着进行下一次旋转.后来看了题解,发现,它的旋转可以是任意角度的,所 ...

  4. vue如何给它的data值赋值

    activeDisplay的值如何改变 用$set();方法 vm.$set('b', 2) 或者 Vue.set(data, 'c', 3) this.someObject = Object.ass ...

  5. day02变量

    一. 什么是变量? 变量:在程序运行过程中,值会发生变化的量.(与之相对应的,常量就是在程序运行过程中,值不会发生变化的量).无论是变量还是常量,在创建时都会在内存中开辟一块空间,用于保存它的值. 二 ...

  6. CentOS 7在grub rescue模式中修复系统

    安装完CentOS 7后 修改硬盘分区后,系统重启后,无法正常启动,进入grub rescue模式: 网上大多数centos grub rescue的资料应该是Centos 7之前的,其中提到的命令很 ...

  7. react-native 运行提示红屏 error: bundling failed: ambiguous resolution: module `/User/xxx/Project/ico/index.js` tries to require `react-native`, but there are several files providing this module. You can de

    运行 react-native start 报错 执行这2个进行清除缓存问题 yarn start -- --reset-cache  npm start -- --reset-cache  

  8. python 模块一览

    一个模块可以对应一个文件 同一个模块,可以import多次,但只会被导入一次 模块的导入顺序 导入模块写在文件最上面 自己写的和内置的以及扩展的分开 顺序:内置,扩展,自己写的 按字母大小写排序 一行 ...

  9. Unity Microphone 无限时长录制

    原创文章:转载请标明出处--博客园 Jason_c Unity可以很方便的通过 Microphone.Start()方法来调用麦克风,但是有一个弊端是,必须传入时长,这就很尴尬了,因为大多数时间,我们 ...

  10. 如何检查 Android 应用的内存使用情况

    Android是为移动设备而设计的,所以应该关注应用的内存使用情况.尽管Android的Dalvik虚拟机会定期执行垃圾回收操作,但这也不意味着就可以忽视应用在何时何处进行内存分配和释放.为了提供良好 ...