P1315 观光公交
题目描述
风景迷人的小城Y 市,拥有n 个美丽的景点。由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务。观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2、3 、4 ……n 号景点。从第 i 号景点开到第 i+1 号景点需要 Di 分钟。任意时刻,公交车只能往前开,或在景点处等待。
设共有m 个游客,每位游客需要乘车1 次从一个景点到达另一个景点,第i 位游客在Ti 分钟来到景点 Ai ,希望乘车前往景点Bi (Ai<Bi )。为了使所有乘客都能顺利到达目的地,公交车在每站都必须等待需要从该景点出发的所有乘客都上车后才能出发开往下一景点。
假设乘客上下车不需要时间。
一个乘客的旅行时间,等于他到达目的地的时刻减去他来到出发地的时刻。因为只有一辆观光车,有时候还要停下来等其他乘客,乘客们纷纷抱怨旅行时间太长了。于是聪明的司机ZZ给公交车安装了 k 个氮气加速器,每使用一个加速器,可以使其中一个 Di 减1 。对于同一个Di 可以重复使用加速器,但是必须保证使用后Di 大于等于0 。
那么ZZ该如何安排使用加速器,才能使所有乘客的旅行时间总和最小?
输入输出格式
输入格式:
输入文件名为bus.in。
第1 行是3 个整数n, m, k ,每两个整数之间用一个空格隔开。分别表示景点数、乘客数和氮气加速器个数。
第2 行是n-1 个整数,每两个整数之间用一个空格隔开,第i 个数表示从第i 个景点开往第i+1 个景点所需要的时间,即 Di 。
第3 行至m+2 行每行3 个整数 Ti, Ai, Bi,每两个整数之间用一个空格隔开。第 i+2 行表示第i 位乘客来到出发景点的时刻,出发的景点编号和到达的景点编号。
输出格式:
输出文件名为bus.out。共一行,包含一个整数,表示最小的总旅行时间。
输入输出样例
3 3 2
1 4
0 1 3
1 1 2
5 2 3
10
说明
【输入输出样例说明】
对D2 使用2 个加速器,从2 号景点到 3 号景点时间变为 2 分钟。
公交车在第1 分钟从1 号景点出发,第2 分钟到达2 号景点,第5 分钟从2 号景点出发,第7 分钟到达 3 号景点。
第1 个旅客旅行时间 7-0 = 7 分钟。
第2 个旅客旅行时间 2-1 = 1 分钟。
第3 个旅客旅行时间 7-5 = 2 分钟。
总时间 7+1+2 = 10分钟。
【数据范围】
对于10% 的数据,k=0 ;
对于20% 的数据,k=1 ;
对于40% 的数据,2 ≤ n ≤ 50,1 ≤ m ≤ 1,000,0 ≤ k ≤ 20,0 ≤ Di ≤ 10,0 ≤ T i ≤ 500;
对于60% 的数据,1 ≤ n ≤ 100,1 ≤ m ≤ 1,000,0 ≤ k ≤ 100 ,0 ≤ Di ≤ 100,0 ≤ T i ≤ 10,000 ;
对于100%的数据,1 ≤ n ≤ 1,000,1 ≤ m ≤ 10,000 ,0 ≤ k ≤ 100,000,0 ≤ Di ≤ 100 ,0 ≤ T i ≤ 100,000。
noip2011提高组day2第3题
Solution:
本题直接贪心+模拟是可以过的。
考虑这样去贪心:
1、每次加速器的使用,要使得总等待时间减小的尽可能多,则必须在车上人数最多的某条路上使用最优。
2、若当前的路上使用了加速器后到达了某个点时,依然要等待某人,则没必要在当前路上使用加速器(用了显然等同于浪费,到当前点还是得等到人上车才能走,每人等待时间并没有减少)。
于是我们直接模拟(注意区别时间和时刻):
设t[i]表示i到i+1两点的原始行驶时间,last[i]表示最后一个从i点出发的人的时刻,arrt[i]表示最终从i点出发的时刻,off[i]表示到i点下车的人数,cut[i]表示i到i+1两点间最多能减少的时间,a[i].t表示第i个人的出发时刻,a[i].s表示第i个人出发起点,a[i].e表示第i个人要到的终点。
模拟使用每个加速器的过程,每次选择满足性质2且当前车上人数最多的路线。
注意一些细节,比如:1、当前路的减少的时间显然不能超过原始行驶时间。 2、若到达某个点的时刻大于最后一个从i点上车的时刻,则当前路上减小的最多时间等于到第i个点下车的人数和到i+1点下车的人数和。 3、当不存在可以再减小的时间时直接跳出枚举。
最后累加每个人的到达时间就ok了。最坏时间复杂度O(kn)。
代码:
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
using namespace std;
int ans,n,m,k,t[],last[],arrt[],off[],cut[];
struct people{
int t,s,e;
}a[];
int main()
{
ios::sync_with_stdio();
cin>>n>>m>>k;
for(int i=;i<n;i++)cin>>t[i];
for(int i=;i<=m;i++){
cin>>a[i].t>>a[i].s>>a[i].e;
last[a[i].s]=max(last[a[i].s],a[i].t);
off[a[i].e]++;
}
for(int i=;i<=n;i++)arrt[i]=max(arrt[i-],last[i-])+t[i-];
while(k--){
for(int i=n;i>=;i--)
if(!t[i-])cut[i-]=;
else {
cut[i-]=off[i];
if(arrt[i]>last[i])cut[i-]+=cut[i];
}
int maxt=,now=;
for(int i=;i<n;i++)
if(cut[i]>maxt)maxt=cut[i],now=i;
if(!now)break;
t[now]--;
for(int i=now+;i<=n;i++)arrt[i]=max(arrt[i-],last[i-])+t[i-];
}
for(int i=;i<=m;i++)ans+=arrt[a[i].e]-a[i].t;
cout<<ans;
return ;
}
P1315 观光公交的更多相关文章
- [luogu]P1315 观光公交[贪心]
[luogu]P1315 [NOIP2011]观光公交 ——!x^n+y^n=z^n 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车, ...
- [NOIP2011] 提高组 洛谷P1315 观光公交
题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...
- 洛谷 P1315 观光公交 —— 贪心
题目:https://www.luogu.org/problemnew/show/P1315 问题是想不明白改动一条边会对后面造成怎样的影响: 实际上影响的会是一段,当某个车站出发时间受其来人牵制时, ...
- NOIP2011 洛谷P1315 观光公交
题目传送门 先解释一下数组的意义: d[i]表示公交车从第i个点到第i+1个点需要的时间 pas结构体中:t表示这个乘客到公交站牌的时间,u表示起点,v表示终点 wait[i]表示公交车在第i个站点等 ...
- 洛谷P1315 观光公交
SB贪心......暴露了我代码能力巨弱的本质. 题面 解:首先我们应该想到DP(但是我想到了贪心......) 然后分析题目本质,每个点有个限制,最早开走时间不得早于最晚上车时间. 然后我们就可以把 ...
- 洛谷P1315 观光公交 [noip2011D2T3] 贪心
正解:贪心 解题报告: 这里是链接! 唔我觉得还是很容易想到是贪心的,这个难就难在怎么贪心 下面列一下常见的几个贪心思想: 1)根据车上的人数排序,人最多的那条路用加速器 错误,人数多并不意味着加速的 ...
- Luogu P1315 观光公交
# 解题思路 一开始自己想了一个贪心,虽然贪心的主要思路是对的,但并不会统计游客用的旅行时间.所以就去题解里面看看,第一篇是最小费用最大流,会比较麻烦,所以就去看了看底下的贪心,第一篇贪心被卡掉了,看 ...
- 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交
P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...
- noip 2011观光公交
P1315 观光公交 95通过 244提交 题目提供者该用户不存在 标签贪心递推2011NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 风景迷人的小城Y 市,拥有n 个美 ...
随机推荐
- maven的两种打包方式
1.maven目前在web上面的使用方式很普遍,而打包的方式也存在很多方式 2.因为涉及一个项目调用另外一个项目的包,并将另外一个项目打成jar的形式便于管理 3.maven打包第一种方式: 将项目检 ...
- CC2541广播机制和代码分析(未完成)
1. 广播通道有3个,是固定的吗?设备为了节省功耗,可以忽略掉几个应答? 连接间隔可以是7.5ms到4s内的任意值,但必须是1.25ms的整数倍,从设备延迟,实际上是一个连接间隔的倍数,代表从设备在必 ...
- Manual install on Windows 7 with Apache and MySQL
These are instructions for installing on Windows 7 desktop (they may also be useful for a server ins ...
- PS 拉伸大长腿
1.打开一个图片工具栏--图像--画布大小 2.选择矩形选框工具--框住要拉升退的位置--然后在按Ctrl+T,进行拉伸即可
- 「题目代码」P1044~P1048(Java)
P1044 谭浩强C语言(第三版)习题5.8 import java.util.*; import java.io.*; import java.math.BigInteger; public cla ...
- 学习用MaxScipt批处理Max文件
学习用MaxScipt批处理Max文件 需求 对几百个.max文件中的指定指定名称的骨骼进行重命名. 解决 考虑到是一次性需求,花了两个钟用maxscript实现了功能,基本逻辑把改名规则做成配置文本 ...
- vuex-Actions的用法
Action 类似于 mutation,不同在于: Action 提交的是 mutation,而不是直接变更状态. Action 是异步的,mutation是同步的. 沿用vuex学习---简介的案例 ...
- 372. Delete Node in a Linked List【LintCode java】
Description Implement an algorithm to delete a node in the middle of a singly linked list, given onl ...
- AttributeError: 'TimeLimit' object has no attribute 'monitor'
原报错代码部分: env.monitor.start(monitor_path, resume=True, video_callable=lambda count: count % record_vi ...
- 统计学习三:2.K近邻法代码实现(以最近邻法为例)
通过上文可知k近邻算法的基本原理,以及算法的具体流程,kd树的生成和搜索算法原理.本文实现了kd树的生成和搜索算法,通过对算法的具体实现,我们可以对算法原理有进一步的了解.具体代码可以在我的githu ...