题目描述

风景迷人的小城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。共一行,包含一个整数,表示最小的总旅行时间。

输入输出样例

输入样例#1:

3 3 2
1 4
0 1 3
1 1 2
5 2 3
输出样例#1:

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 观光公交的更多相关文章

  1. [luogu]P1315 观光公交[贪心]

    [luogu]P1315 [NOIP2011]观光公交 ——!x^n+y^n=z^n 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车, ...

  2. [NOIP2011] 提高组 洛谷P1315 观光公交

    题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...

  3. 洛谷 P1315 观光公交 —— 贪心

    题目:https://www.luogu.org/problemnew/show/P1315 问题是想不明白改动一条边会对后面造成怎样的影响: 实际上影响的会是一段,当某个车站出发时间受其来人牵制时, ...

  4. NOIP2011 洛谷P1315 观光公交

    题目传送门 先解释一下数组的意义: d[i]表示公交车从第i个点到第i+1个点需要的时间 pas结构体中:t表示这个乘客到公交站牌的时间,u表示起点,v表示终点 wait[i]表示公交车在第i个站点等 ...

  5. 洛谷P1315 观光公交

    SB贪心......暴露了我代码能力巨弱的本质. 题面 解:首先我们应该想到DP(但是我想到了贪心......) 然后分析题目本质,每个点有个限制,最早开走时间不得早于最晚上车时间. 然后我们就可以把 ...

  6. 洛谷P1315 观光公交 [noip2011D2T3] 贪心

    正解:贪心 解题报告: 这里是链接! 唔我觉得还是很容易想到是贪心的,这个难就难在怎么贪心 下面列一下常见的几个贪心思想: 1)根据车上的人数排序,人最多的那条路用加速器 错误,人数多并不意味着加速的 ...

  7. Luogu P1315 观光公交

    # 解题思路 一开始自己想了一个贪心,虽然贪心的主要思路是对的,但并不会统计游客用的旅行时间.所以就去题解里面看看,第一篇是最小费用最大流,会比较麻烦,所以就去看了看底下的贪心,第一篇贪心被卡掉了,看 ...

  8. 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交

    P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...

  9. noip 2011观光公交

    P1315 观光公交 95通过 244提交 题目提供者该用户不存在 标签贪心递推2011NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录   题目描述 风景迷人的小城Y 市,拥有n 个美 ...

随机推荐

  1. 【BZOJ1176】[BOI2007]Mokia 摩基亚

    [BZOJ1176][BOI2007]Mokia 摩基亚 题面 bzoj 洛谷 题解 显然的\(CDQ\)\(/\)树套树题 然而根本不想写树套树,那就用\(CDQ\)吧... 考虑到点\((x1,y ...

  2. Java:String、StringBuffer、StringBuilder

    一.String 1. String类是final类,意味着String类不能被继承,它的成员方法都默认为final方法.在早期的JVM版本中,被final修饰的方法会转为内嵌调用来提升执行效率.从J ...

  3. Android远程推送笔记

    Android远程推送笔记 Android推送有很多种实现方案,但都没办法和苹果的APNS比拟,这里主要来讲述一下我遇到的问题,和作出的抉择. 首先,为了快速接入,所以就没有自己搭建推送服务器,而是使 ...

  4. CentOS 7.2静默安装Oracle11g

      Preface       Today I'm gonna export some test data to another server.The source server is Windows ...

  5. Font Awesome 完美的图标字体

    好久没来,虽说鄙人的人气不咋地,但还是很想念自己这一亩二分田地. 近期用在平台开发中,看着设计师摆开阵势,准备大画图标,想着自己将会很KUBI拼凑css-sprite图片,接着写一大堆 class^= ...

  6. ionic LoadingController 模块使用

    html 代码: <ion-header> <ion-navbar> <ion-title>Loading</ion-title> </ion-n ...

  7. 通过流的方式操作hadoop的API

    通过流的方式操作hadoop的API 功能: 可以直接用来操作hadoop的文件系统 可以用在mapreduce的outputformat中设置RecordWrite 参考: 概念理解 http:// ...

  8. Comparison of Android versions(strcmp的应用)

    Description As an Android developer, itˇs really not easy to figure out a newer version of two kerne ...

  9. 【转】c++面试基础

    1,关于动态申请内存 答:内存分配方式三种: (1)从静态存储区域分配:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在. 全局变量,static变量. (2)在栈上创建:在执行函 ...

  10. encode 与 decode

    decode 将其它编码的字符串转换成unicode编码,例如:str1.decode("gb2312"),表示将gb2312编码的字符串转换成unicode编码 encode 将 ...