【题解】Grape luogu1156改 dp
考试时被数据坑了
题目
原题 传送门
题目描述:
众所周知的是oyyf 沉迷葡萄,今天的oyyf为了葡萄溜到了He 大佬家的葡萄园偷葡萄,
可惜的是还没偷到葡萄He 大佬就来葡萄园了,吓的oyyf 直接跳进了He 大佬挖的地洞里
面,地洞里全是粉红女装,oyyf 分分钟的想要离开这里。
古人云“非极必欧”,He 大佬靠在葡萄架上摇摆,慢慢掉下了D 颗的炒鸡巨大的葡萄,
恰巧oyyf 又是众人皆知的轻盈,所以oyyf 可以把葡萄堆起来然后爬出去!但是oyyf 意识
到自己在爬葡萄的期间是会饿的,每单位时间里oyyf 的HP 会下降一点,如果oyyf 的HP
下降到零,那么oyyf 此时就要饿死在地下室里然后被He 大佬吊起来打了,于是oyyf 可以
选择在第i 个葡萄掉下来的时候吃掉它获得j 点HP。
所以oyyf 需要你来解决一个问题,她最快需要多少单位时间才能离开这个充满粉红女
装的地洞,然而如果她注定和葡萄们命丧于此,她最久能活久呢
输入格式
第一行为三个正整数D(地洞的高度),O(一共会掉下的葡萄数)
接下来G 行每行为三个正整数Ti(第i 个葡萄落下的时间),Xi(吃掉第i 个葡萄能获得的
HP),Hi(第i 个葡萄的高度)
输出格式
如果能够溜出去,输出一个正整数N 代表最短时间
如果不能溜出去,输出两行,第一行为“OYYF ZU”,第二行为一个正整数M 代表存
活的最长时间
样例
.in
20 3 10
3 4 10
4 5 20
5 4 10
.out
4
数据范围
对于40%的数据 1<=O<=40
对于100%的数据 1<=O<=1000,0<=Ti<=1000, 0<=Xi<=100,0<=Hi<=100
思路
DP 难度并不高……是各位大佬被彼此的题play 了后,使人心情愉悦的一道DP
对于f[i][j]记录在使用了第i 个葡萄达到高度为j 的时候剩余的HP
转移
- 选择吃掉的时候,f[i][j]=f[i-1][j]减去i-1 到i 的消耗再加上吃掉i 得到的HP
- 选择搭的时候,f[i][j]=f[i-1][j-a[i].h]减去i-1 到i 的消耗
若达到了高度要求那么就可以直接输出答案
否则就是输出目前的HP 最大值
(↑需要排序优化保证最优值,所以只要用葡萄作为最外层循环就可以保证第一个满
足的就是最早的时候啦)
注意点
- 排序是前提极
- 注意转移的时候要考虑高度大于0 和HP 大小
- 搜索是有分的恩
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,g,anst=10,xd=0;
int f[1005][2505];
struct tree {
int t,hp,h;
} a[1005];
inline int read(){
int x=0,w=1;char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='0') w=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch-48),ch=getchar();
return x*w;
}
int cmp(tree a,tree b) {
return a.t<b.t;
}
int main() {
//freopen("grape.in","r",stdin);
//freopen("grape.out","w",stdout);
scanf("%d%d%d",&n,&m,&g);
n=read();m=read();g=read();
for (int i=1; i<=m; i++) {
a[i].t=read();
a[i].hp=read();
a[i].h=read();
scanf("%d%d%d",&a[i].t,&a[i].hp,&a[i].h);
xd+=a[i].h;
}
sort(a+1,a+m+1,cmp);
int pos=0;
memset(f,-0x3f,sizeof(f));
f[pos][0]=g;
register int i,j;
for (i=1; i<=m; i++)
for (j=0; j<=n; j++) {
if(f[i-1][j]-(a[i].t-a[i-1].t)>=0)
f[i][j]=max(f[i][j],f[i-1][j]-(a[i].t-a[i-1].t)+a[i].hp);
if(f[i-1][j-a[i].h]-(a[i].t-a[i-1].t)>=0&&j-a[i].h>=0) {
f[i][j]=max(f[i][j],f[i-1][j-a[i].h]-(a[i].t-a[i-1].t));
if(j==n) {
printf("%d",a[i].t);
return 0;
}
}
anst=max(anst,f[i][j]+a[i].t);
}
printf("OYYF ZU\n");
printf("%d",anst);
return 0;
}
【题解】Grape luogu1156改 dp的更多相关文章
- 【题解】POJ1934 Trip (DP+记录方案)
[题解]POJ1934 Trip (DP+记录方案) 题意: 传送门 刚开始我是这么设状态的(谁叫我DP没学好) \(dp(i,j)\)表示钦定选择\(i\)和\(j\)的LCS,然而你会发现这样钦定 ...
- 【题解】剪纸条(dp)
[题解]剪纸条(dp) HRBUST - 1828 网上搜不到题解?那我就来写一篇吧哈哈哈 最优化问题先考虑\(dp\),设\(dp(i)\)表示将前\(i\)个字符(包括\(i\))分割成不相交的回 ...
- 【题解】地精部落(DP)
[题解]地精部落(DP) 设\(f_i\)表示强制第一个是谷的合法方案数 转移枚举一个排列的最大值在哪里,就把序列分成了互不相干的两个部分,把其中\(i-1\choose j-1\)的数字分配给前面部 ...
- bzoj 2669 题解(状压dp+搜索+容斥原理)
这题太难了...看了30篇题解才整明白到底咋回事... 核心思想:状压dp+搜索+容斥 首先我们分析一下,对于一个4*7的棋盘,低点的个数至多只有8个(可以数一数) 这样的话,我们可以进行一个状压,把 ...
- 算法进阶面试题07——求子数组的最大异或和(前缀树)、换钱的方法数(递归改dp最全套路解说)、纸牌博弈、机器人行走问题
主要讲第五课的内容前缀树应用和第六课内容暴力递归改动态规划的最全步骤 第一题 给定一个数组,求子数组的最大异或和. 一个数组的异或和为,数组中所有的数异或起来的结果. 简单的前缀树应用 暴力方法: 先 ...
- 理想乡题解 (线段树优化dp)
题面 思路概述 首先,不难想到本题可以用动态规划来解,这里就省略是如何想到动态规划的了. 转移方程 f[i]=min(f[j]+1)(max(i-m,0)<=j<i 且j符合士兵限定) 注 ...
- CF 1400F x-prime Substrings 题解【AC自动机+DP】
CF 1400F.x-prime Substrings 题意: 给定一个由\('1'\)到\('9'\)组成的字符串\(s\)和一个数\(x\),定义一个串为\(x-prime\)串,当且仅当这个串上 ...
- BZOJ 1087 题解【状压DP】
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3112 Solved: 1816[Submit][ ...
- LeetCode题解——Unique Path(DP与优化)
题目:A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...
随机推荐
- CCNA 第二章 以太网回顾
1:半双工和全双工 (1):半双工:类似于单车道: (2):全双工:类似是双向多车道: 2:思科三层模型 (1): (2):核心层.集散层(汇聚层).接入层各功能: 1:核心层:大量数据快速交换:不要 ...
- 解决移动端300ms延迟fastclick
为什么要使用fastclick 移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击.为了能够立即响应用户的点击事件,才有了fastclick. f ...
- opencv——几何变换原理与实现
摘要 图像几何变换又称为图像空间变换, 它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置.几何变换不改变图像的像素值, 只是在图像平面上进行像素的重新安排. 几何变换大致分为仿射变换.投影变换. ...
- .NET 平台系列6 .NET Core 发展历程
系列目录 [已更新最新开发文章,点击查看详细] 在我的上一篇博客<.NET平台系列5 .NET Core 简介>中主要介绍了.NETCore的基本情况,主要包括.NET跨平台的缘由 ...
- 四种方式带你层层递进解剖算法---hash表不一定适合寻找重复数据
一.题目描述 找出数组中重复的数字 > 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. ...
- 2020BUAA-个人博客-案例分析
个人博客作业-软件案例分析 项目 内容 北航2020软工 班级博客 作业要求 具体要求 我的课程目标 通过案例分析提升自己对于软件工程的认识 课程收获 分析软件,了解软件的定位 第一部分 调研,评测( ...
- beta设计和计划
项目 内容 课程:北航-2020-春-软件工程 博客园班级博客 要求 Beta设计和计划 我们在这个课程的目标是 提升团队管理及合作能力,开发一项满意的工程项目 这个作业在哪个具体方面帮助我们实现目标 ...
- ES6学习-3 const
const声明一个只读的常量.一旦声明,常量的值就不能改变,所以在声名时就进行赋值. const的作用域与let命令相同,只在声明所在的块级作用域内有效. const命令声明的常量,同样存在暂时性死区 ...
- Swagger简明教程
一.什么是swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化RESTful风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法, ...
- [Java] Structs
背景 基于MVC的WEB框架 在表示层过滤访问请求并处理 步骤 在eclipse中创建Web动态项目 导入相关jar包到WEB-INF/lib 在WEB-INF目录下新建web.xml,配置Filte ...