【题解】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). ...
随机推荐
- Window内核学习之保护模式基础
段寄存器 段寄存器有6个分别是 cs,ss,ds,es,fs,gs.这些段寄存器包含16位的可见部分和80位的隐藏部分,共90位. 16位的可见部分就是我们知道的cs等段寄存器的值,我们可以在od中查 ...
- 引言:CTF新世界
1. CTF的昨天和今天 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式.CTF起源于1996年DEFCON全球黑客 ...
- 克鲁斯卡尔(Kruskal)算法(代码)
算法代码 C#代码 using System; using System.Linq; namespace Kruskal { class Program { static void Main(stri ...
- [Qt] 编译问题
shadow build https://blog.csdn.net/cjmcp/article/details/14135191 https://blog.csdn.net/josephfeng/a ...
- [ML] 高德软件的路径规划原理
路径规划 Dijkstra s:起点:S:已知到起点最短路径的点:U:未知到起点最短路径的点 Step 1:S中只有起点s,从U中找出路径最短的 Step 2:更新U中的顶点和顶点对应的路径 重复St ...
- 【转载】Python 代码调试技巧
https://www.ibm.com/developerworks/cn/linux/l-cn-pythondebugger/ Python 代码调试技巧 张 颖2012 年 5 月 03 日发布 ...
- Ubuntu相关系统配置问题
1.Ubuntu 16.04下安装VMware Tools 由于下载的是ubuntu-16.04.3-desktop-amd64,需要安装vmware tools,原来提取提取文件再解压的方式比较麻烦 ...
- 在/etc/profile下配置java的环境变量
在/etc/profile下配置java的环境变量 原创 Java 作者:xiaoyan5686670 时间:2016-01-18 14:30:28 6152 0 以root用户编辑:#vi /e ...
- Mysql_源码包安装详细过程
一.mysql安装 1.二进制安装 2.源码包安装 3.rpm包安装 1.源码包安装 1)上传或下载源码包 [root@db02 ~]# rz mysql-5.6.46.tar.gz 2)安装依赖 由 ...
- python程序打包成exe(使用pyinstaller)
pyinstaller下载地址:https://github.com/pyinstaller/pyinstaller/ (这个文件能够自动安装依赖项,其他版本的貌似还要自己安装依赖项) 下载之后解压到 ...