垃圾陷阱-洛谷P1156

题目链接-戳这里

题目描述

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

卡门想把垃圾堆起来,等到堆得与井同样高时,她就能逃出井外了。另外,卡门可以通过吃一些垃圾来维持自己的生命。

每个垃圾都可以用来吃或堆放,并且堆放垃圾不用花费卡门的时间。

假设卡门预先知道了每个垃圾扔下的时间 t ( 0 < t ≤ 1000 ) t(0< t \le 1000) t(0<t≤1000),以及每个垃圾堆放的高度 h ( 1 ≤ h ≤ 25 h(1 \le h \le 25 h(1≤h≤25)和吃进该垃圾能维持生命的时间 f ( 1 ≤ f ≤ 30 ) f(1 \le f \le 30) f(1≤f≤30),要求出卡门最早能逃出井外的时间,假设卡门当前体内有足够持续 10 10 10小时的能量,如果卡门 10 10 10小时内没有进食,卡门就将饿死。

输入格式

第一行为 2 2 2个整数,$D $和 G ( 1 ≤ G ≤ 100 ) G (1 \le G \le 100) G(1≤G≤100), G G G为被投入井的垃圾的数量。

第二到第 G + 1 G+1 G+1行每行包括 3 3 3个整数: T ( 0 < T < = 1000 ) T (0 < T <= 1000) T(0<T<=1000),表示垃圾被投进井中的时间; F ( 1 ≤ F ≤ 30 ) F (1 \le F \le 30) F(1≤F≤30),表示该垃圾能维持卡门生命的时间;和 H ( 1 ≤ H ≤ 25 ) H (1 \le H \le 25) H(1≤H≤25),该垃圾能垫高的高度。

输出格式

如果卡门可以爬出陷阱,输出一个整表示最早什么时候可以爬出;否则输出卡门最长可以存活多长时间。

样例输入 #1

20 4
5 4 9
9 3 2
12 6 10
13 1 1

样例输出 #1

13

提示

卡门堆放她收到的第一个垃圾: h e i g h t = 9 height=9 height=9;

卡门吃掉她收到的第 2 2 2个垃圾,使她的生命从 10 10 10小时延伸到 13 13 13小时;

卡门堆放第 3 3 3个垃圾, h e i g h t = 19 height=19 height=19;

卡门堆放第 4 4 4个垃圾, h e i g h t = 20 height=20 height=20。


解题思路:

本题中看起来能作为状态的数据有四个: 高 度 、 血 量 、 物 品 、 时 间 高度、血量、物品、时间 高度、血量、物品、时间

而垃圾掉是在掉落时间掉落时一定被处理的,所以时间可以看作垃圾的一个分量,且物品使用的先后顺序是由时间固定的

所以我们别忘了对垃圾的时间进行排序

在不容易看出题中数据用来表示什么状态表示量时,我们可以一一尝试看看;例如:

f[ i ][ j ] 表示处理前 i 个垃圾,在 j 血量时达到的最大高度 \text{f[ i ][ j ] 表示处理前 i 个垃圾,在 j 血量时达到的最大高度} f[ i ][ j ] 表示处理前 i 个垃圾,在 j 血量时达到的最大高度

此时我们易得状态转移方程: f[ i ][ j ] = max(f[ i - 1 ][ j ] + trash[i].h , f[ i -1 ][ j + trash[i].t]) \text{f[ i ][ j ] = max(f[ i - 1 ][ j ] + trash[i].h , f[ i -1 ][ j + trash[i].t])} f[ i ][ j ] = max(f[ i - 1 ][ j ] + trash[i].h , f[ i -1 ][ j + trash[i].t])

这是时候的 j j j 血量看作是不考虑时间时所得的最大血量
如此状态方程似乎没有问题[doge] 但是我们会发现 j j j 的枚举中我们并不好判断 ,并且可能会很大 不妨再试试下一个

f[ i ][ j ] 表示处理前 i 个垃圾,在 j 的高度时能达到的最大血量 \text{f[ i ][ j ] 表示处理前 i 个垃圾,在 j 的高度时能达到的最大血量} f[ i ][ j ] 表示处理前 i 个垃圾,在 j 的高度时能达到的最大血量

我们再写状态转移方程: f[ i ][ j ] = max(f[ i − 1 ][ j ] + trash[ i ].c , f[ i − 1 ][ j − trash[ i ]. h ]) \text{f[ i ][ j ] = max(f[ i − 1 ][ j ] + trash[ i ].c , f[ i − 1 ][ j − trash[ i ]. h ])} f[ i ][ j ] = max(f[ i − 1 ][ j ] + trash[ i ].c , f[ i − 1 ][ j − trash[ i ]. h ])

这样是不是也对呢~

此时的 j j j 的范围变小了,高度的判断也变的容易很多。注意状态转移时要判断血量是否充足就可


AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
typedef unsigned long long ull;
#define fastIO ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define pb push_back
#define PF(x) ((x)*(x))
#define LF(x) ((x)*PF(x))
const int N = 2e2+10 , mod = 1e9 + 7;int D,G;struct trush{int t,f,h;bool operator<(const trush &tmp)const{return t<tmp.t;}
}T[N];int F[N][N]; //F[i][j] 前i件垃圾中在处理后达到j高度时的最大血量int main()
{#ifdef CODE_ZshZsh_Begin
#endif
/*<---------------------------------------- CODE BEGIN ---------------------------------------->*/fastIO;cin>>D>>G;for(int i=1;i<=G;i++){int t,f,h;cin>>t>>f>>h;T[i]={t,f,h};}sort(T+1,T+1+G);memset(F,-0x3f,sizeof F);F[0][0]=10;for(int i=1;i<=G;i++){for(int j=0;j<=D;j++){if(F[i-1][j]>=T[i].t){F[i][j]=max(F[i][j],F[i-1][j]+T[i].f);}if(j>=T[i].h && F[i-1][j-T[i].h]>=T[i].t){F[i][j]=max(F[i][j],F[i-1][j-T[i].h]);}}}int maxh=0,maxf=0;int i;T[0]={0,0,0};for(i=1;i<=G;i++){for(int j=0;j<=D;j++){if(F[i][j]-T[i].t>=0) maxh=max(maxh,j);maxf=max(maxf,F[i][j]);}if(maxh>=D) break;}//cout<<T[i].t<<" "<<maxf<<endl;if(maxh>=D) cout<<T[i].t<<endl;else cout<<maxf<<endl;/*<----------------------------------------- CODE END ----------------------------------------->*/
#ifdef CODE_ZshZsh_End
#endifreturn 0;
}

垃圾陷进-洛谷P1156相关推荐

  1. 洛谷P1156 垃圾陷阱 题解浅谈刷表法与填表法

    洛谷P1156 垃圾陷阱 题解&浅谈刷表法与填表法 填表法 :就是一般的动态规划,当前点的状态,可以直接用状态方程,根据之前点的状态推导出来. 刷表法:由当前点的状态,更新其他点的状态.需要注 ...

  2. [洛谷P1156][codevs1684]垃圾陷阱

    题目大意:一头奶牛掉进了深度为d的坑里,现在有g个垃圾在特定时刻ti扔进来.奶牛可以吃垃圾以获得体力,吃第i个垃圾能获得mi的体力,也可以堆放垃圾以逃生,第i个垃圾高度为hi.当高度≥d时奶牛成功逃生 ...

  3. N进制正反累加判回文数(洛谷P1015题题解,Java语言描述)

    题目要求 P1015题目链接 分析 开始的时候写了这么一个代码,应该是比较基础的,是十进制的. private static void low() {Scanner scanner = new Sca ...

  4. 信息学奥赛一本通 1820:【00NOIP提高组】进制转换 | 洛谷 P1017 [NOIP2000 提高组] 进制转换

    [题目链接] ybt 1820:[00NOIP提高组]进制转换 洛谷 P1017 [NOIP2000 提高组] 进制转换 注意:两OJ上题目内容相同,输入输出要求不同 [题目考点] 1.数制 [解题思 ...

  5. P1017 进制转换 (洛谷)

    进制转换 (洛谷 P1017P1017P1017题) 题解来了,如果有错尽管批评指正,我会努力修改的首先就是我们一点都不可爱的题目传送门了,接下来是枯燥的题目描述,收揽的同学可以继续往下看,如果想先尝 ...

  6. 洛谷——P1017 [NOIP2000 提高组] 进制转换(C++)

    洛谷--P1017 [NOIP2000 提高组] 进制转换(C++) 前言 前几天才参加了第十三届蓝桥杯比赛,发现居然有两道于进制相关的题,而且那道编程题--X进制减法,别说做了,题都看不懂,真的是枯 ...

  7. 【题解】洛谷P1066 [NOIP2006TG] 2^k进制数(复杂高精+组合推导)

    洛谷P1066:https://www.luogu.org/problemnew/show/P1066 思路 挺难的一道题 也很复杂 满足题目要求的种数是两类组合数之和 r的最多位数m为 w/k(当w ...

  8. 对于洛谷提高试炼场-动态规划篇的爆破

    题外话 由于本蒟蒻的动态规划实在是太弱啦,所以有必要爆破一下洛谷提高试炼场.里面有很多非常好,难度也合适的动态规划题--(然而你还是抄了不少题解) niconiconi~让我们一起开始爆破吧. lv- ...

  9. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

最新文章

  1. MyBatis-11MyBatis动态SQL之【if】
  2. python3精要(55)-模块,私有方法
  3. ubuntu下超级用户和普通用户
  4. ViewState机制的解析(转自csdn)
  5. 恍然小悟,去掉Excel的worksheet(工作表)保护的新方法
  6. 考研数学:【以错补错】 降低做题出错率
  7. VMware 11完全安装Mac OS X 10.10
  8. golang学习之旅(1)
  9. linux-用户管理
  10. Resid 学习笔记1-基础命令
  11. ajax获取session值_java程序员你真的了解session与cookie吗?
  12. 【笔试/面试】—— 二叉树的最远距离
  13. Unicode-GBK映射表下载。
  14. 韦东山freeRTOS系列教程之【第八章】事件组(event group)
  15. 【文本识别】CRNN
  16. C++ 输出tm结构的各个组成部分
  17. 【雷达】基于TI毫米波雷达IWR6843ISK实现室内人员检测附matlab代码
  18. PHOTOSHOP绘制卡通人物简单教程
  19. Linux中time()函数用法
  20. Android App压力测试

热门文章

  1. Python转码网易云音乐缓存
  2. Joomla!相关介绍
  3. FFmpeg命令(六)、 视频提取无音视频
  4. 【冷推荐】各领域最值得推荐的入门书籍,值得收藏!!
  5. 舔狗舔到最后一无所有(简单动态规划)
  6. 如何从MSU系统补丁里提取出所需要的文件?
  7. Go语言爬取网站磁力链接
  8. RFID资产管理的应用效果
  9. 快看这里!!!抖音热歌大全(纯属娱乐)
  10. 科目余额表-调整格式