题目描述 Description###

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

输入描述 Input Description###

第1行是3个整数n,m,k,每两个整数之间用一个空格隔开。分别表示景点数、乘客数和氮气加速器个数。第2行是n-1个整数,每两个整数之间用一个空格隔开,第i个数表示从第i个景点开往第i+1个景点所需要的时间,即Di。第3行至m+2行每行3个整数Ti,Ai,Bi,每两个整数之间用一个空格隔开。第i+2行表示第i位乘客来到出发景点的时刻,出发的景点编号和到达的景点编号。

输出描述 Output Description###

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

样例输入 Sample Input###

3 3 2

1 4

0 1 3

1 1 2

5 2 3

样例输出 Sample Output###

10

数据范围及提示 Data Size & Hint###

【输入输出样例说明】对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分钟。

【数据范围】1≤n≤1,000,1≤m≤10,000,0≤k≤100,000,0≤Di≤100,0≤Ti≤100,000。

之前的一些废话###

博客弃坑多年,更新了博客模板,以后可以用makedown来装B了

题解###

首先考虑\(k=1\)的情况,枚举在每一段路上加速带来的影响。若在第\(k\)段路上加速的话,会使在\(k+1\)站下车的乘客旅行时间减少,仅仅是这些么?如果我们在这里加速的话,会提前到达以后的车站,若到了第i个车站,并且所有在这站上车的人都来了(也就意味着不用等待了),我们就可以立即开向下一个车站。所以得到了一个结论,在第k条路上加速带来效益区间为\([k+1,i]\)(其中\(i+1\)个车站需要等待)所以选择加速的路径自然是带来效益最大的路径了。下面的问题就是如何快速统计这些效益了。我们设\(last[i]\)表示第\(i\)个车站最后一个人来的时间,\(cnt[i]\)表示在i车站下车的人,\(TM[i]\)表示若不加速到第i个车站的时间。\(w[i]\)表示在第i条路上加速的效益,\(w[i]=\sum_{k=i+1}^j cnt[k]\) \(j+1\)车站需要等待,注意等待是\(last[j+1]<TM[j+1]\)不能有等号,因为如果有等号加速之后又需要在这里等待了。统计完\(w\)数组之后选取\(w\)最大的路径然后把这条边的长度减1。类似的操作重复\(k\)次即可。这其中还有一些细节,如果当前路径长度已经被减成0了那么就不能再取他了,把\(w[i]\)置成0即可。

代码###

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<cstdlib>
using namespace std;
typedef long long LL;
#define mem(a,b) memset(a,b,sizeof(a))
typedef pair<int,int> PII;
#define X first
#define Y second
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=1010;
int n,m,K,dis[maxn],a,b,c,cnt[maxn],TM[maxn],w[maxn],last[maxn],ans;
int main()
{
n=read();m=read();K=read();
for(int i=1;i<n;i++)dis[i]=read();
for(int i=1;i<=m;i++)
{
a=read();b=read();c=read();
last[b]=max(last[b],a);
cnt[c]++;ans-=a;
}
while(K--)
{
mem(TM,0);//mem(w,0);
for(int i=2;i<=n;i++)TM[i]=max(TM[i-1],last[i-1])+dis[i-1];
for(int i=n-1;i>0;i--)
{
if(!dis[i]){w[i]=0;continue;}
w[i]=cnt[i+1];
if(last[i+1]<TM[i+1])w[i]+=w[i+1];
}
int MAX=0,maxN=0;
for(int i=1;i<n;i++)
if(MAX<w[i])
{
MAX=w[i];
maxN=i;
}
if(!MAX)break;
dis[maxN]--;
}
mem(TM,0);
for(int i=2;i<=n;i++)TM[i]=max(TM[i-1],last[i-1])+dis[i-1];
for(int i=1;i<=n;i++)ans+=TM[i]*cnt[i];
printf("%d\n",ans);
return 0;
}

总结###

个人非常讨厌这种题,细节特别多,写起来特别烦。

NOIP201110观光公交的更多相关文章

  1. vijos1741 观光公交 (贪心)

    https://www.vijos.org/p/1741 P1741观光公交 请登录后递交 标签:NOIP提高组2011[显示标签]   描述 风景迷人的小城Y市,拥有n个美丽的景点.由于慕名而来的游 ...

  2. NOIP2011 观光公交

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

  3. Luogu 1315 【NOIP2011】观光公交 (贪心)

    Luogu 1315 [NOIP2011]观光公交 (贪心) Description 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供 ...

  4. NOIP观光公交

    #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #inc ...

  5. noip 2011观光公交

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

  6. 观光公交 2011年NOIP全国联赛提高组(贪心,递推)

    观光公交 2011年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold       题目描述 Description 风景迷人的小城 Y 市 ...

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

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

  8. luoguP1315 观光公交 题解(NOIP2011)(贪心)

    P1315 观光公交 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cm ...

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

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

随机推荐

  1. git pull --rebase的理解

    在使用git的过程中经常需要使用到git pull命令,在更新远端代码的同时如果与本地代码产生冲突了, 那么冲突的文件中就出现了需要手动合并的部分,而git pull --rebase不同的地方则是当 ...

  2. C++ 静态库与动态库以及在 Windows上 的创建、使用

    一.什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以 ...

  3. 在Anaconda中使用linux的命令

    在Anaconda中使用linux的命令 1.在anaconda中执行以下命令即可(要先activation 想用的环境): conda install m2-base 2.安装git.添加环境变量即 ...

  4. 第四节:Geo类型介绍以及Redis批量操作、事务、分布式锁

    一. Geo类型 1. 类型说明 Geo 是 Redis 3.2 版本后新增的数据类型,用来保存兴趣点(POI,point of interest)的坐标信息.可以实现计算两 POI 之间的距离.获取 ...

  5. Quartz的配置与使用

    什么是Quartz Quartz是OpenSymphony开源组织在Job scheduling领域的开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为 ...

  6. S-T-E-A-M Science Technology Engineering Art Mathematics 五种思维模式

    S-T-E-A-M五个英文字母分别代表 Science 科学,Technology 技术,Engineering 工程,Art 艺术以及 Mathematics 数学.它们并不是简单地整合原来的分科体 ...

  7. 使用NumPy、Numba的简单使用(二)

    本来要写NLP第三课动态规划的,日了,写到一半发现自己也不会了,理论很简单,动态规划咋回事也知道,但是实现在源码上还是有点难度,现在简单给予题目描述,小伙伴也可以来思考一下,例题一,我们现在有1元硬币 ...

  8. OpenGL入门1.3:着色器 GLSL

    前言 经过之前一段时间的学习(渲染管线简介)我们已经知道了着色器(Shader)是运行在GPU上的程序,这些小程序为图形渲染管线的某个特定部分而运行,着色器只是一种把输入转化为输出的程序,着色器也是一 ...

  9. 2019-9-18-WPF-如何调试-binding

    原文:2019-9-18-WPF-如何调试-binding title author date CreateTime categories WPF 如何调试 binding lindexi 2019- ...

  10. .NET WebFrom跨时区项目时间问题处理方法

    前段时间因为公司的一个 WebFrom 项目设计到跨时区的问题,处理了一段时间,终于解决了,写个博客记录一下,方便以后回顾以及给他人提供一个参考的方法. 本次的项目因为跨越了多个时区,在一些时间上会受 ...