【LSGDOJ 1850】滑雪课程
题目描述
贝西去科罗拉多州去滑雪,不过还她不太会玩,只是个能力为 1 的渣渣。贝西从 0 时刻进入滑雪场,一到 T 时刻就必须离开。滑雪场里有 N 条斜坡,第 i 条斜坡滑行一次需要 D i 分钟,要求游客的能力达到 C i 或以上时才能进入。贝西决心参加一些滑雪课程以提高自己的素质,这样可以在有限的时间内多滑几次坡。
滑雪场提供了 S 门课程。第 i 门课的开始时刻为 M i ,持续 L i 分钟,如果想参加课程,就不能迟到或早退。上完课之后,贝西的滑雪能力将变成 A i 。注意,不是能力增加 A i ,而是变成 A i ,所以乱上课的话反而会使能力下降。贝西可以随意安排她的时间:滑雪、上课,或美美地喝上一杯可可汁。请问她如何安排上课和滑雪的时间,滑坡的次数才能达到最大?
输入
• 第一行:三个整数 T,S 和 N,1 ≤ T ≤ 10 4 ,1 ≤ S ≤ 100,1 ≤ N ≤ 10 4
• 第二行到 S +1 行:第 i+1 行描述了第 i 门课程,分别为 M i ,L i 和 A i ,1 ≤ M i ,L i ≤ 10 4 ,1 ≤A i ≤ 100
• 第 S + 2 行到 S + N + 1 行:第 S + i + 1 行描述了第 i 条斜坡,分别为 C i 和 D i ,1 ≤ C i ≤100,1 ≤ D i ≤ 10 4
输出
• 单个整数,表示贝西可以滑完的最大次数
样例输入
样例输出
提示
先滑 1 次二号斜坡,然后去上课,再去一号斜坡连滑 5 次
题解:
F[i][j] 表示第i秒能力值为j时的最大滑的次数
然后背包,每次用合法状态(F[i][j]!=-1)去更新后面的状态
但暴力dp过不了 加一个贪心优化掉10000
Ft[j]表示能力值为<=j的最小滑坡时间,我们就不必枚举每一个滑坡去选最小的了.
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int N=,M=;
int gi(){
int str=;char ch=getchar();
while(ch>'' || ch<'')ch=getchar();
while(ch>='' && ch<='')str=str*+ch-,ch=getchar();
return str;
}
int F[N][M];
struct sor
{
int to,sta,l;
}e[M];
struct Chan
{
int l,lim;
}c[N];
bool comp(const sor &p,const sor &q){return p.sta<q.sta;}
int n,s,m,last[M];
int check(int x)
{
int l=,r=s,mid;
while(l<=r){
mid=(l+r)>>;
if(e[mid].sta==x)return mid;
if(e[mid].sta>x)r=mid-;
else l=mid+;
}
return -;
}
bool cmp(const Chan &p,const Chan &q){return p.lim<q.lim;}
int pf(int x)
{
int ans,l=,r=m,mid;
while(l<=r){
mid=(l+r)>>;
if(c[mid].lim<=x)ans=mid,l=mid+;
else r=mid-;
}
return ans;
}
int ft[N];
int getmin(int x)
{
int minn=;
for(int i=;i<=x;i++)
if(c[i].l<minn)minn=c[i].l;
return minn;
}
int main()
{
//freopen("pp.in","r",stdin);
n=gi();s=gi();m=gi();
int mh=,minn=N;
for(int i=;i<=s;i++)
{
e[i].sta=gi();e[i].l=gi();e[i].to=gi();
if(e[i].to>mh)mh=e[i].to;
}
sort(e+,e+s+,comp);
for(int i=;i<=m;i++){c[i].lim=gi(),c[i].l=gi();if(c[i].lim<minn)minn=c[i].lim;}
sort(c+,c+m+,cmp);
for(int i=;i<=mh;i++)last[i]=pf(i);
for(int i=;i<=mh;i++)ft[i]=getmin(last[i]);
memset(F,-,sizeof(F));
F[][]=;
int tmp,maxn=;
for(int i=;i<n;i++)
{
tmp=check(i);
maxn=;
for(int j=;j<=mh;j++)
{
if(F[i][j]==-)continue;
F[i+ft[j]][j]=F[i][j]+;
if(F[i][j]>F[i+][j])F[i+][j]=F[i][j];
if(tmp!=- && i+e[tmp].l<=n && F[i][j]>maxn)maxn=F[i][j];
}
if(tmp!=- && i+e[tmp].l<=n)F[i+e[tmp].l][e[tmp].to]=maxn;
}
int ans=;
for(int i=;i<=mh;i++)if(F[n][i]>ans)ans=F[n][i];
cout<<ans;
return ;
}
【LSGDOJ 1850】滑雪课程的更多相关文章
- USACO 滑雪课程
#include<cstdio> #include<iostream> using namespace std; int T,S,N,maxd; ],lv[],next[],f ...
- 【USACO】滑雪课程
滑雪课程贝西去科罗拉多州去滑雪,不过还她不太会玩,只是个能力为 1 的渣渣.贝西从 0 时刻进入滑雪场,一到 T 时刻就必须离开.滑雪场里有 N 条斜坡,第 i 条斜坡滑行一次需要 Di 分钟,要求游 ...
- USACO 1.3.6 Ski Course Design[滑雪课程设计]
先说说思路: 这题比上一道坑人的wormholes简单多了!我一看到这题,“XXX设计”,还以为要用到什么dp呢,没想到是水题 用两层循环,第一层循环相差17中的上界,第二层遍历所有的山峰计算答案.并 ...
- 【USACO2009 Open】滑雪课程ski
[USACO2009 Open]滑雪课程 Ski Lessons Time Limit: 1000 ms Memory Limit: 131072 KBytes Description 约翰请贝西去科 ...
- 洛谷 P3650 [USACO1.3]滑雪课程设计Ski Course Design
P3650 [USACO1.3]滑雪课程设计Ski Course Design 题目描述 农民约翰的农场里有N座山峰(1<=N<=1000),每座山都有一个在0到100之间的整数的海拔高度 ...
- 滑雪(dp好题)
题目描述:贝西去科罗拉多州去滑雪,不过还她不太会玩,只是个能力为 1 的渣渣.贝西从 0 时刻进入滑雪场,一到 T 时刻就必须离开.滑雪场里有 N 条斜坡,第 i 条斜坡滑行一次需要 Di 分钟,要求 ...
- 【USACO】DP动态规划小测(一)
{20160927 19:30~21:30} 总分400分,我113.33,稳稳地垫底了......(十分呼应我上面的博客名,hhh~)过了这么多天我才打完所有代码,废话我也就不多说了.不过,虽然时间 ...
- [USACO精选] 第二章 动态规划(一)
#4 公司利润 2014-01-16 这真的是动归?怎么觉得有点贪心的心态在.时间复杂度O(N),空间复杂度O(1),轻松加愉快!唯一要注意的是ANS一开始要赋负值,因为最终答案可能是负的. ; va ...
- USACO Section 1.3 题解 (洛谷OJ P1209 P1444 P3650 P2693)
usaco ch1.4 sort(d , d + c, [](int a, int b) -> bool { return a > b; }); 生成与过滤 generator&& ...
随机推荐
- alpha-咸鱼冲刺day4
一,合照 emmmmm.自然还是没有的. 二,项目燃尽图 三,项目进展 QAQ具体工作量没啥进展.但是前后端终于可以数据交互了!.. 四,问题困难 日常啥都不会,百度真心玩一年. 还得自学nodejs ...
- 四则运算----C++版
一.设计思想 因java中已做过,就是简单的将java中的语句调换为C++的语句. 二.代码 #include<iostream.h> #include<Stdlib.h> v ...
- Ubuntu登陆密码忘记
在VMware中安装了Ubuntu 10.04,经过了一段时间,再次登录的时候居然进不去了, 一开始不知道怎样在虚拟机中进入到Grub启动界面,网上搜索了一番,按照以下步骤重新为用户设定了新密码. 重 ...
- 基于协程的Python网络库gevent
import gevent def test1(): print 12 gevent.sleep(0) print 34 def test2(): print 56 gevent.sleep(0) p ...
- codevs 3981 动态最大子段和
3981 动态最大子段和 http://codevs.cn/problem/3981/ 题目等级 : 钻石 Diamond 题目描述 Description 题目还是简单一点好... 有n个 ...
- Mongodb 3 查询优化(慢查询Profiling)
开启慢查询Profiling Profiling级别说明 0:关闭,不收集任何数据. 1:收集慢查询数据,默认是100毫秒. 2:收集所有数据 1.通过修改配置文件开启Profiling 修改启动mo ...
- [2]十道算法题【Java实现】
前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...
- 用‘+=’拼接字符串,打印时总会出现一个undefined
var str; for(var i = 0; i < 5; i++){ str += String(i); } console.log(str); 他喵的,打印的结果竟然是"unde ...
- LDAP是什么
LDAP的英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.LDAP目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的 ...
- Java中如何实现j并发更新数据库同一条数据
分情况来说:普通单应用并发.多应用或多台服务器并发 情况一:普通单应用并发 使用关键字synchronized就可实现. 情况二:多应用或多台服务器并发 因多个应用之间并非同一个jvm(应用)内,因此 ...