题目描述 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. 启动tomcat内存溢出

    在运行项目的过程中,启动tomcat内存溢出.查阅了一些解决办法,总结出来留个笔记. 1.使用Myeclipse2014+tomcat 7 ,在MyEclipse中将项目部署到Tomcat下,启动to ...

  2. Visual Studio 2015 Tools for Unity使用基础

    Unity4.x编辑器侧 具体版本号:Visual Studio 2015 Tools for Unity 3.7.0.1 该插件在:Microsoft Visual Studio Tools for ...

  3. Java文件上传的几种方式

    文件上传与文件上传一样重要.在Java中,要实现文件上传,可以有两种方式: 1.通过Servlet类上传 2.通过Struts框架实现上传 这两种方式的根本还是通过Servlet进行IO流的操作. 一 ...

  4. SpringBoot启用https

    1.利用JDK自带的keytool生成证书 keytool -genkey -storetype PKCS12 -alias tomcat -keyalg RSA -keysize 2048 -key ...

  5. PHP高级进阶梳理

    基础篇 1.深入理解计算机系统 2.现代操作系统 3.C程序设计语言 4.C语言数据结构和算法 5.Unix环境高级编程 6.TCP/IP网络通信详解 7.Java面向对象编程 8.Java编程思想 ...

  6. 状态(State)模式--设计模式

    定义与特点 1.1 定义 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样. 1.2 特点 状态模式优点: 封装了转换规则,并枚举可能的状态,它将所有与某个状 ...

  7. 【机器学习笔记】来吧!解析k-NN

    序: 监督型学习与无监督学习,其最主要区别在于:已知的数据里面有没有标签(作为区别数据的内容). 监督学习大概是这个套路: 1.给定很多很多数据(假设2000个图片),并且给每个数据加上标签(与图片一 ...

  8. .net post请求webservice

    class Program { static void Main(string[] args) { , name = "jxp" }); var a = HttpHelper.Po ...

  9. mssql 导出作业,导出表,导出存储过程等

    1.mssql 导出作业 1.选中sql server 代理-作业 2.点击F7 显示对象资源管理器详细信息,3.按住ctrol 选中 右键编写作业脚本到就可以了 2.mssql 导出表和存储过程等 ...

  10. Qt背景不显示问题

    背景不显示的只有主窗口会发生,原因是主窗口使用的QWidget类 解决办法 重构paintEvent事件,添加即可 void LoginWidget::paintEvent(QPaintEvent * ...