【USACO2009 Open】滑雪课程 Ski Lessons

Time Limit: 1000 ms
Memory Limit: 131072 KBytes

Description

约翰请贝西去科罗拉多去滑雪。不过贝西不太会玩,她只是个滑雪能力为1的渣渣。所以她决心参加一些滑雪课程。滑雪场提供S门课程,第i门课开始的时间是Mi,持续时间为Li ,上完课之后,贝西的滑雪能力将变成Ai。注意,能力不是增加Ai,而是变成Ai。

滑雪场有N条斜坡,第i条斜坡滑行一次需要Di 分钟,要求游客的滑雪能力达到Ci或以上时才能进入。

贝西可以随意安排她的时间:滑雪、上课,或美美地喝上一杯可可汁,但她在滑雪场只能呆到第T分钟。请问她如何安排时间,滑行次数才能尽量多?

Input

第一行:三个用空格分开的整数: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

Output

第一行:单个整数,表示在时限内贝西可以滑完的最大次数

Sample Input

 10 1 2

 3 2 5

 4 1

 1 3

Sample Output

 6

Hint

先滑 1 次 2 号斜坡,然后去上课,再去 1号连滑 5 次,一共 6 次

我实在太弱...这题做了特别久

这其实是一道简单的dp,首先状态f[i][j] 表示到第i个时刻贝茜的能力值为j时能滑的最大次数

接下来,转移,这时候有三种转移方式:1、美美地给自己倒一杯卡布奇诺(不要问我哪来的卡布奇诺) 2、上课长知识  3、就剩滑冰了吧

这样我们就可以得到一个转移方程:

(1<=k<=j)最后一个转移应为f[i-tn[j]][j]+1

那么肯定有人要问l[i][j]是什么,tn[j]又是什么,其实l[i][j]就是到第i时刻上课已经结束能得到j能力值的课程开始的最晚时刻,tn[j]就是能力值为j时滑一次雪所需的最短时间(一个小贪心)

嗯~~~看起来这样就可以A掉这题了

其实

不然

如果我们枚举k,那么就会T掉,所以我们可以加一个数组g[i],在dp过程中顺便记录下每个时刻f[i][k]的最大值来优化这个方程,这样就可以完美将其解决掉了OwO

什么?没听懂?下面是代码

 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int l[][],tn[],f[][],g[];
int main()
{
int t,s,n,st,ai,ei;
memset(f,,sizeof(f));
memset(g,,sizeof(g));
memset(tn,,sizeof(tn));
scanf("%d%d%d",&t,&s,&n);
for (int i=;i<=s;i++){
scanf("%d%d%d",&st,&ai,&ei);
l[st+ai][ei]=max(l[st+ai][ei],st);
}
int c,d;
for (int i=;i<=n;i++){
scanf("%d%d",&c,&d);
for (int j=c;j<=;j++)
tn[j]=min(tn[j],d);
}
f[][]=;
for (int i=;i<=t;i++)
for (int j=;j<=;j++){
f[i][j]=f[i-][j];
if (l[i][j]) f[i][j]=max(f[i][j],g[l[i][j]]);
if (i>=tn[j]) f[i][j]=max(f[i][j],f[i-tn[j]][j]+);
g[i]=max(g[i],f[i][j]);
}
printf("%d",g[t]);
return ;
}

最新文章

  1. Java的四种引用方式
  2. CentOS下使用Postfix + Dovecot + Dnsmasq搭建极简局域网邮件系统
  3. Date.prototype.format
  4. Leetcode 19 Remove Nth Node From End of List 链表
  5. Xcode 6 UITextField 键盘不弹出
  6. display:-webkit-box
  7. Android基调(十六)- Service:startService()、stopService()、bindService()、unbindService()加
  8. 使用nvm管理node不同版本,安装,环境配置,切换不同版本的node版本
  9. sql 语句-初级进阶(二)
  10. 深入React技术栈之初入React世界
  11. Luogu P2261 [CQOI2007]余数求和
  12. iOS开发-- 一个苹果证书如何多次使用
  13. WPF技术实现控件截图
  14. java.lang.String 使用介绍
  15. Java零基础教程(二)基础语法
  16. day2-课堂笔记
  17. Linux硬盘镜像获取与还原(dd、AccessData FTK Imager)
  18. 【明哥报错簿】之【 &quot;javax.servlet.http.HttpServlet&quot; was not found on the Java Build Path || HttpServletRequest/HttpServletResponse cannot be resolved to a type】
  19. vue computed 可以使用getter和setter
  20. Expression Blend实例中文教程(2) - 界面快速入门

热门文章

  1. 第十一节:Web爬虫之数据存储(数据更新、删除、查询)
  2. 腾讯云,体验域名注册解析与SSL证书
  3. STM32 内存管理实验
  4. 使用Mybatis的逆向工程自动生成代码
  5. noip模拟赛 洗衣
  6. noip模拟赛 蒜头君的树
  7. 使用AtomicInteger原子类代替i++线程安全操作
  8. SiteMesh2-decorators.xml文件
  9. 在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出MethodArgumentNotValidException异常,因此,只需要在ExceptionHandler类中添加处理对应异常的方法即可。
  10. hdu2852 KiKi&amp;#39;s K-Number