题目描述 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. 重构 改善既有代码的设计 (Martin Fowler 著)

    第1章 重构, 第一个案例 1.1 起点 1.2 重构的第一步 1.3 分解并重组 statement() 1.4 运用多态取代与价格相关的条件逻辑 1.5 结语 第2章 重构原则 2.1 何谓重构 ...

  2. 强大的性能监测工具dstat

    强大的性能监测工具dstat 本节分为以下几个部分: dstat介绍: dstat命令是一个用来替换vmstat.iostat.netstat.nfsstat和ifstat这些命令的工具,是一个全能系 ...

  3. 物联网架构成长之路(44)-Docker私有仓库Harbor

    0. 前言 安装docker.docker-compose,这些在我以前的博客讲过,这里就不继续说明了,有需要的可以参考我之前的博客. https://www.cnblogs.com/wunaozai ...

  4. 十、自定义ThreadPoolExecutor线程池

    自定义ThreadPoolExecutor线程池 自定义线程池需要遵循的规则 [1]线程池大小的设置 1.计算密集型: 顾名思义就是应用需要非常多的CPU计算资源,在多核CPU时代,我们要让每一个CP ...

  5. 明解JAVA 第一章答案

    练习1-1 无法运行 练习1-2 package candle1220; class Nightwatch{ public static void main(String[] args) { Syst ...

  6. mysql8 安装

    准备工作: 首先安装这些依赖 yum install -y flex yum install gcc gcc-c++ cmake  ncurses ncurses-devel bison libaio ...

  7. Dubbo从入门到实战:入门篇

    很多时候,其实我们使用这个技术的时候,可能都是因为项目需要,所以,我们就用了,但是,至于为什么我们需要用到这个技术,可能自身并不是很了解的,但是,其实了解技术的来由及背景知识,对于理解一项技术还是有帮 ...

  8. Focal Loss 理解

    本质上讲,Focal Loss 就是一个解决分类问题中类别不平衡.分类难度差异的一个 loss,总之这个工作一片好评就是了. 看到这个 loss,开始感觉很神奇,感觉大有用途.因为在 NLP 中,也存 ...

  9. Kubernetes configMap(配置文件存储)

    Kubernetes configMap(配置文件存储) 官方文档:https://kubernetes.io/docs/tasks/configure-pod-container/configure ...

  10. 关联mysql失败_Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezon' 时区错误

    时区错误,MySQL默认的时区是UTC时区,比北京时间晚8个小时. 所以要修改mysql的时长 在mysql的命令模式下,输入: set global time_zone='+8:00'; 再次连接成 ...