描述

风景迷人的小城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该如何安排使用加速器,才能使所有乘客的旅行时间总和最小?

格式

输入格式

第1行是3个整数n, m, k,每两个整数之间用一个空格隔开。分别表示景点数、乘客数和氮气加速器个数。

第2行是n-1个整数,每两个整数之间用一个空格隔开,第i个数表示从第i个景点开往第i+1个景点所需要的时间,即Di。

第3行至m+2行每行3个整数Ti, Ai, Bi,每两个整数之间用一个空格隔开。第i+2行表示第i位乘客来到出发景点的时刻,出发的景点编号和到达的景点编号。

输出格式

共一行,包含一个整数,表示最小的总旅行时间。

样例1

样例输入1

 
3 3 2
1 4
0 1 3
1 1 2
5 2 3

样例输出1

 
10

限制

1s

提示

样例说明:

对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 ≤ Ti ≤ 500;
对于60%的数据,1 ≤ n ≤ 100,1 ≤ m ≤ 1,000,0 ≤ k ≤ 100,0 ≤ Di ≤ 100,0 ≤ Ti ≤ 10,000;
对于100%的数据,1 ≤ n ≤ 1,000,1 ≤ m ≤ 10,000,0 ≤ k ≤ 100,000,0 ≤ Di ≤ 100,0 ≤ Ti ≤ 100,000。

来源

NOIp2011提高组Day2第三题

解析:用完加速器后要使总时间最小,应该是贪心,但是怎么贪,是一个问题,n个景点,m个乘客,对于每个景点来说,有一个汽车到达的时间arrive[n],还有一个从此景点的出发时间(即乘客的最晚到达时间)latest[n],我们应该加速的是乘客先到,汽车后到的景点(乘客后到,汽车先到的景点,加速没有意义啊,乘客不来,老司机也没有办法),所以应该找一段区间,满足两个要求,一是在这个区间下车的人最多(这样加速的意义更大,减小即使加速也要在站等乘客的时间),还有一个要求是这段区间满足每个站点都是汽车后到,乘客先到。满足这两个条件的区间即可。

代码主要步骤

读数据-->计算bus到i点的时间arrive[i]-->bus从i点出发的最晚时间(即乘客到达i点的最晚时间)latest[i]
-->1--i点有多少乘客在这段区间下车(前缀累加和)-->找同时满足两个条件的区间(交集),一个是该区间sum[next[i]-1]-sum[i]
另一个区间是该区间各点均满足arrive[i]>latest[i](等于不用加速器)(即乘客先到,汽车后到需要加速)
(乘客后到,加速没有意义)

代码

 #include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,m,k;
int Di[];
int t[],a[],b[];
int arrive[],latest[];
int sum[],next[];
int minn,sta;
int ans;
int maxl;
int main()
{
freopen("bus.in","r",stdin);
freopen("bus.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n-;i++)
scanf("%d",&Di[i]);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&t[i],&a[i],&b[i]);
sum[b[i]]++;
if(t[i]>latest[a[i]])latest[a[i]]=t[i];
}
//前缀累加和
for(int i=;i<=n;i++)
sum[i]+=sum[i-];
while()
{
//每次更新距离后(用了加速器)都要更新arrive[]
arrive[]=;
for(int i=;i<=n;i++)
arrive[i]=max(arrive[i-],latest[i-])+Di[i-];
//且要更新next[],因为用了加速器后,有些点是不满足区间条件
next[n]=n;
for(int i=n-;i>=;i--)
{
//满足条件区间连续 1(*) 2 3(*) 4(*) 5(*) 6 7(*) 8
// 3---next[3]-1 3 6 6 6 6 8 8 8
next[i]=next[i+];
if(arrive[i+]<=latest[i+])//第i+1个点不满足
next[i]=i+;
}
//贪心需找区间
maxl=;
while(!Di[maxl]&&maxl<=n-)
++maxl;
if(maxl==n||k==)break;
//寻找最优区间
//i+1--next[i]-1,sum[next[i]]-sum[i]=i+1--
for(int i=maxl+;i<=n-;i++)
if(Di[i]&&sum[next[maxl]]-sum[maxl]<sum[next[i]]-sum[i])
maxl=i;
if(sum[next[maxl]]-sum[maxl]==)break;//后面已无乘客
int dd=;
for(int i=maxl+;i<=next[maxl]-;i++)
dd=min(dd,arrive[i]-latest[i]);//最小时间差,乘客先到,汽车后到
dd=min(dd,k);//这段区间中使用加速器,所有乘客都受益,所以不存在人数最多相同区间
dd=min(dd,Di[maxl]);
k-=dd;//区间没人都受益,受益总和确定
Di[maxl]-=dd;
}
//此时所以bus都比乘客先到达
for(int i=;i<=m;i++)
ans+=abs(arrive[b[i]]-t[i]);//防止没有加速器 ,可能为负
cout<<ans<<endl;
return ;
}

代码难点

1,前缀和累加.

2,next[n]记录一段连续区间,满足要求的区间为 [i+1,next[i]-1].(最好手动写一遍next[]的数组)

总结

1,贪心条件

2,基础技法:前缀和累加&&next[i]连续

NOIP2011(提高组)DAY2---观光公交(vijosP1741)的更多相关文章

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

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

  2. [NOIP2011提高组day2]-3-观光公交

    3.观光公交 (bus.cpp/c/pas) [问题描述] 风景迷人的小城 Y 市,拥有 n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光 ...

  3. NOIP2011 提高组 Day2

    自测时间:2017.4.12 8:15——11:45 实际得分:100+0+0=100 期望得分:100+100+0=260 T2 符合要求的总价值*符合要求的总个数 写成:符合要求的总价值*区间总个 ...

  4. [NOIP2011提高组day2]-2-聪明的质监员

    2.聪明的质监员(qc.cpp/c/pas) [问题描述] 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到 n 逐一编号,每个矿石都有自己的重量 wi 以及价 ...

  5. [NOIP2011提高组day2]-1-计算系数

    1.计算系数 (factor.cpp/c/pas) [问题描述] k n m给定一个多项式(ax+by)^k ,请求出多项式展开后(x^n)*(y^m)项的系数. [输入] 输入文件名为 factor ...

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

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

  7. Noip2011 提高组 Day1 T1 铺地毯 + Day2 T1 计算系数

    Day1 T1 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小 ...

  8. [Luogu1313][NOIP2011提高组]计算系数

    题目描述 给定一个多项式 (by+ax)k(by+ax)^k(by+ax)k ,请求出多项式展开后 xn×ymx^n \times y^mxn×ym 项的系数. 输入输出格式 输入格式: 共一行,包含 ...

  9. 洛谷P1313 [NOIP2011提高组Day2T1]计算系数

    P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别 ...

随机推荐

  1. Codeforces Round #331 (Div. 2) B. Wilbur and Array 水题

    B. Wilbur and Array Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/596/p ...

  2. MyBatis之六:缓存

    MyBatis 3中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置.默认情况下是没有开启缓存的,除了局部的session缓存,可以增强变现而且处理循环依赖也是必须的.要开启二级缓存,你需 ...

  3. GLSL实现Glow效果 [转]

    http://blog.csdn.net/a3070173/archive/2008/11/04/3220940.aspx Glow即辉光效果现在已成为3D图形中一个引人注目的特效.本文主要介绍如何使 ...

  4. python选择排序

    def select_sort(list): for i in range(len(list)): position = i for j in range(i,len(list)): if list[ ...

  5. StarlingMVC Framework 原理。。。

    向starlingmvc 中添加bean后..会根据Metadata标签,分别交给不同的Processor去处理...然后会执行每个bean的postConstruct函数.相当于初始化函数...可以 ...

  6. 打开Excel时提示"您尝试打开的文件**.xls的格式与文件扩展名指定的格式不一致"

    问题描述:     系统安装了WPS时,Analyzer导出excel时候,会提示"您尝试打开的文件**.xls的格式与文件扩展名指定的格式不一致",这是Excel的安全问题,   ...

  7. 实例源码--Android理财工具源码

      下载源码   技术要点: 1.Sqlite数据库的综合使用 2.控件的综合使用 3. 源码带详细的中文注释 ...... 详细介绍: 1. Sqlite数据库的综合使用 本套源码采用了Sqlite ...

  8. discuz pc端显示触摸版

    1./source/function/function_core.php function checkmobile() {return true; //此为加上的内容global $_G; ..... ...

  9. 小白日记9:kali渗透测试之主动信息收集(二)四层发现:TCP、UDP、nmap、hping、scapy

    四层发现 四层发现的目的是扫描出可能存活的IP地址,四层发现虽然涉及端口扫描,但是并不对端口的状态进行精确判断,其本质是利用四层协议的一些通信来识别主机ip是否存在. 四层发现的优点: 1.可路由且结 ...

  10. myEclipse6.5与数据库(SQL Server2008)连接遇到的问题(自己总结的干货)<用SSH框架的时候,用servlet+javabean+jsp的时候>

    昨天因为学习SSH框架的搭建,时隔一年又重新遇到了myEclipse连接数据库的问题.废话不多说,上干货 (以下全部按照我遇到的问题的顺序,也就是没有顺序,就是任性) 请注意:这是在myEclipse ...