【题解】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). ...
随机推荐
- java 多线程 实现多个线程的顺序执行
场景 编写一个程序,启动三个线程,三个线程的name分别是A,B,C:,每个线程将自己的ID值在屏幕上打印5遍,打印顺序是ABCABC... 使用 synchronized 实现 public cla ...
- SaaS模式的CRM系统有哪些优势?
早在10年前(2010年),就出现了SaaS模式的CRM系统.SaaS CRM一经面世,便迅速受到广大企业的青睐. SaaS CRM是指CRM厂家把CRM软件部署在自己的服务器上,有需要的客户能够根据 ...
- 风变编程(Python自学笔记)第10关-工作量计算器
1.%f的意思是格式化字符串为浮点型,%.1f的意思是格式化字符串为浮点型,并保留1位小数. 2.向上取整:ceil() 使用ceil()方法时需要导入math模块,例如 1 >>> ...
- iozone测试方法-20191008
iozone 一.简介 磁盘设备之上是文件系统,测试磁盘的工具往往就是调用驱动块设备驱动的接口进行读写测试.而文件系统的测试软件就是,针对文件系统层提供的功能进行测试,包括文件的打开关闭速度以及顺 ...
- 重定向-管道技术-xargs命令详解
重定向 什么是重定向? 将原本要输出在屏幕的内容,重新定向输出到指定的文件或设备中. 为什么要使用重定向? 1.备份的时候需要知道备份的结果. 2.屏幕上输出信息比较重要的时候需要保存下来. 3.定时 ...
- Linux ll查看文件属性详解-软硬链接详解
Linux文件属性及类型 [root@localhost ~]# ll anaconda-ks.cfg 文件类型 权限 硬连接数 文件的大小 文件的创建,修改时间 - rw-------. 1 roo ...
- linux中级之防火墙的数据传输过程
网络数据传输过程 netfilter在数据包必须经过且可以读取规则的位置,共设有5个控制关卡.这5个关卡处的检查规则分别放在5个规则链中(有的叫钩子函数(hook functions).也就是说5条链 ...
- cgic: CGI的C函数库-(转自COS)
下载回源码包以后,就3个文件:cgic.c 函数库capture.c 一个很简单的CGI例子,仅仅输出两行提示文字cgictest.c 一个演示读取form表单数据的CGI例子 首先在 ...
- C语言的指针数组与指针数组
一.指针数组与指针数组 1,指针数组 顾名思义,即一个元素全部是指针的数组,其形式与普通数组相似,形式如 *a[N]. 在理解指针数组的使用方式前,我先来说下我个人对数组的理解. 比如一维整形数组(形 ...
- 多条件分页 (Day_31)
接我的上篇博客 EasyUI_使用datagrid分页 (Day_28) . 按惯例,我们先看效果图 EasyUI 实现多条件分页很简单. 我们先来通过官网了解下这两个属性: 显然,有了load 方 ...