滑雪(dp好题)
题目描述:贝西去科罗拉多州去滑雪,不过还她不太会玩,只是个能力为 1 的渣渣。贝西从 0 时刻进入滑雪场,一到 T 时刻就必须离开。滑雪场里有 N 条斜坡,第 i 条斜坡滑行一次需要 Di 分钟,要求游客的能力达到 Ci 或以上时才能进入。贝西决心参加一些滑雪课程以提高自己的素质,这样可以在有限的时间内多滑几次坡。
滑雪场提供了 S 门课程。第 i 门课的开始时刻为 Mi,持续 Li 分钟,如果想参加课程,就不能迟到或早退。上完课之后,贝西的滑雪能力将变成 Ai。注意,不是能力增加 Ai,而是变成 Ai,所以乱上课的话反而会使能力下降。贝西可以随意安排她的时间:滑雪、上课,或美美地喝上一杯可可汁。请问她如何安排上课和滑雪的时间,滑坡的次数才能达到最大?(懒得概括了。。)
同一个坡可以滑无数次。
输入格式
• 第一行:三个整数 T ,S 和 N ,1 ≤ T ≤ 10^4 , 1 ≤ S ≤ 100, 1 ≤ N ≤ 10^5
• 第二行到 S + 1 行:第 i + 1 行描述了第 i 门课程,分别为 Mi,Li 和 Ai,1 ≤ Mi , Li ≤ 10^4
, 1 ≤Ai ≤ 100
• 第 S + 2 行到 S + N + 1 行:第 S + i + 1 行描述了第 i 条斜坡,分别为 Ci 和 Di,1 ≤ Ci≤100, 1 ≤ Di ≤ 10^4
输出格式
• 单个整数,表示贝西可以滑完的最大次数
解题过程:
1.一开始被那么多的数据吓住了。。完全找不到头绪,然后就开始看数据范围来瞎凑。状态至少是二维的,当前的能力值肯定是要算在状态里的(因为最大只有100),然后N肯定不会拿来当状态(否则10^5 * 100=10^7,转移必须是O(1)才不会超时,而O(1)的转移肯定是做不到的。)。那么只能是用时间T来当状态。。F[i][j]表示时间为i且能力值为j的时候最多已经滑了多少次。。然后看了下样例解释,竟然同一个坡可以滑无数次。题目里竟然没说,还好没思路去看了下样例。。
以后做题还是要认真看完样例解释,充分理解题意。。
2.既然同一个坡可以滑很多次,那么机智的我们肯定会选择当前能滑的且时间花费最少的 去滑。所以用t[i]处理出需要能力值为i的山坡的最小花费。然后扫一遍求出can[i],即当前能力值为i的时候能滑的山坡的最小花费。can[i]=min(can[i-1],t[i]);
3.对于状态F[i][j],首先可以继承F[i-1][j]的值,然后可以由F[i-can[j]][j]+1转移过来(滑一次花费最小的山坡)。
那么如果学习了一门课呢?显然如果要学习一门课,课程的结束时间必须小于等于i,那么其实只考虑课程的结束时间等于i就行,因为F[i][j]会继承F[k][j]的值(k<i)。那么先预先处理处course[i][j] ,表示结束时间为i,学习后能力值为j的课程所要花费的最少时间,如果不存在则为无穷大。那么有:
F[i][j]=max(F[i-1][j] , F[i-can[j]][j]+1 , max(F[i-course[i][j]][k]) ) ,k<j.
而对于 max(F[i-course[i][j]][k]) 可以用s[i][j]保存下来,那么方程变为
F[i][j]=max(F[i-1][j] , F[i-can[j]][j]+1 , s[i-course[i][j]][j-1]) ; 在求F[i][j]的时候s[i-course[i][j]][j-1] 已经求出来了。
算法复杂度O(100*N)
下面给出来自YYL大神的O(S^2)算法,屌爆了。
先把课程按开始时间排序。
F[i]表示上完第i节后最多能滑多少个山坡。
对于每个F[i],枚举它前面的课程(course[i].left > course[j].right),那么在学完课程j到开始学课程i的这段时间里可以去滑雪,这段时间里的能力值当然就是course[i].cap;
初始 F[i]=course[i].left/can[1] (i是第一节课)
那么有 F[i]=max(F[j]+(course[i].left-course[j].right) / can[course[j].cap]);
最后答案就是 ans=max(F[i]+(T-course[i].right)/can[course[i].cap]);
ans=max(ans,T/can[1]);(考虑一节课也不上的情况)
0ms秒杀所有数据啊,Orz Orz Orz Orz Orz。
滑雪(dp好题)的更多相关文章
- DP百题练(一)
目录 DP百题练(一) 线性 DP 简述 Arithmetic Progressions [ZJOI2006]物流运输 LG1095 守望者的逃离 LG1103 书本整理 CH5102 移动服务 LG ...
- ACM :漫漫上学路 -DP -水题
CSU 1772 漫漫上学路 Time Limit: 1000MS Memory Limit: 131072KB 64bit IO Format: %lld & %llu Submit ...
- [poj2247] Humble Numbers (DP水题)
DP 水题 Description A number whose only prime factors are 2,3,5 or 7 is called a humble number. The se ...
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
- POJ 1155 TELE 背包型树形DP 经典题
由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...
- 【dp入门题】【跟着14练dp吧...囧】
A HDU_2048 数塔 dp入门题——数塔问题:求路径的最大和: 状态方程: dp[i][j] = max(dp[i+1][j], dp[i+1][j+1])+a[i][j];dp[n][j] = ...
- 13年山东省赛 The number of steps(概率dp水题)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud The number of steps Time Limit: 1 Sec Me ...
- POJ 2342 树形DP入门题
有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...
- Vijos1057 盖房子(DP经典题)
之前没有怎么刷过dp的题,所以在此学习了~(感谢walala大神的思路,给了我很大的启发) 也算是自己学习的另一种dp题型吧 先贴上状态转移方程: if(a[i][j]) f[i][j]=min(f[ ...
- dp百题大过关(第一场)
好吧,这名字真是让我想起了某段被某教科书支配的历史.....各种DP题层出不穷,不过终于做完了orz 虽然各种手糊加乱搞,但还是要总结一下. T1 Monkey Banana Problem 这 ...
随机推荐
- apt-get的常用用法
我们装完linux后的第一件事情就是安装软件了,下面的命令可以帮助你在Ubuntu发行版或基于Debain的发行版上快速的安装软件: sudo apt-get install package-name ...
- python下载地址
https://www.python.org/downloads/release/python-351/
- Android 随想录之 Android 系统架构
应用层(Application) Android 的应用层由运行在 Android 设备上的所有应用程序共同构成(系统预装程序以及第三方应用程序). 系统预装应用程序包含拨号软件.短信.联系人.邮件客 ...
- Android软键盘弹出时把布局顶上去的解决方法
原文: 解决Andriod软键盘出现把原来的布局给顶上去的方法(转) 链接:http://blog.sina.com.cn/s/blog_9564cb6e0101g2eb.html 决方法,在main ...
- struct和class
先概述一下: 1.C# 是纯面向对象语言,struct 与 class 都是继承Object,都是对象.struct 是值类型.class 是引用类型. 2.struct是值类型,在Stack上分配地 ...
- LinuxShell脚本攻略--第八章 当个好管家
监视磁盘的使用情况 $ du file1.txt file2.txt $ du -a file_or_dir #-a递归输出指定目录的所有文件统计 $ du file_or_dir #这只是显示子目录 ...
- XML Attributes(XML属性)
XML Attributes(XML属性) android:autoLink 是否自动链接网址或邮箱地址: android:autoText 自动检测错误: android:bufferType ...
- for( unsigned int i=heapSize/2-1; i>=0; --i)
unsigned int的表示 今天在写堆排序的时候遇到一个BUG void builMaxHeap( int *arr,unsigned int heapSize){ unsigned int i; ...
- TPatch动态补丁系统(iOS)
版权声明:本文由朱煌原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/160 来源:腾云阁 https://www.qclou ...
- java 模板
模板模式: 解决某类事情的步骤有些是固定的,有些是会发生变化的,这时我们提供 一个模板代码,从而提高效率. 模板模式的作用: 1.解决这类事情其中一件的解决方案. 2.分析代码,把发生变化的代码抽象取 ...