描述

风景迷人的小城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位乘客来到出发景点的时刻,出发的景点编号和到达的景点编号。

输出格式

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

数据范围

样例说明:

对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。

----------------------------------------------------------------

正解=贪心

设 time[i] 为到达第 i 的时间,

设 last[i] 为出现在第 i 点的最后一个游客的时间,

题目求所有乘客等待时间和,即ans=(time[b[i]]-T[i])(1<=i<=m)

T[i]为定值,那应使time的值尽量小。

显然time[i]=max(time[i-1],last[i-1])+d[i-1];

由于使用一个加速器后可能会是多个time减少,

last[i]则就成为了一个限制条件(使time[i]的减少无意义),

在一条路径使用加速器后会对后面多个time(不是所有)产生影响,

设在 i 放一个加速器可影响到的点数的数量为f[i],

设 sum 为记录在 i 之前及 i 已下车的人数,

则如果在i点使用加速器后,可影响的人数为sum[f[i]+i]-sum[i],

也就是在 i 到 f[i]+i 之间要到达下一个点的人数

便可以此贪心,

每使用一次加速器后(减少d),重新再算 time 和 f,在从中选出sum[f[i]+i]-sum[i]中最大的,在 i 用加速器

Ps. 100000*1000的复杂度居然能过- =

代码如下:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<string>
 5 #include<cmath>
 6 #include<queue>
 7 #define INF 999999999999
 8 #define LL long long
 9 #define Max(x,y) if(y>x) x=y;
10 #define N 10010
11 //using namespace std ;
12 int f[N],sum[N],dis[N],up[N],down[N],b[N],last[N],time[N];
13 int n,m,k,total,ans;
14 int max(int a,int c){
15     return  a > c ? a : c;
16 }
17 int main(){
18     scanf("%d%d%d",&n,&m,&k);
19     for(int i=1;i< n;i++) scanf("%d",&dis[i]);
20     for(int i=1;i<=m;i++) {
21         int a,c;
22         scanf("%d%d%d",&c,&a,&b[i]);
23         total+=c;
24         ++up[a];
25         ++down[b[i]];
26         Max(last[a],c);
27         for(int j=b[i];j<=n;j++) sum[j]++;
28     }
29     while(k--){
30         for(int i=2;i<=n;i++)
31           time[i]=max(time[i-1],last[i-1])+dis[i-1];
32         f[n]=0;
33         for(int i=n-1;i;i--)
34          if(time[i+1]>last[i+1])
35            f[i]=f[i+1]+1;
36          else f[i]=1;
37
38         int maxval=-1,maxpos=0;
39
40         for(int i=1;i<n;i++)
41          if(dis[i]&&f[i]&&sum[f[i]+i]-sum[i]>maxval){
42                 maxval=sum[f[i]+i]-sum[i];
43                 maxpos=i;
44          }
45          if(maxpos) --dis[maxpos];
46     }
47     for(int i=2;i<=n;i++)
48           time[i]=max(time[i-1],last[i-1])+dis[i-1];
49     for(int i=1;i<=m;i++) ans+=time[b[i]];
50     printf("%d",ans-total);
51 } 

View Code

转载于:https://www.cnblogs.com/Blacko/p/3376597.html

noip2011 公交观光相关推荐

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

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

  2. 【做题记录】[NOIP2011 提高组] 观光公交

    P1315 [NOIP2011 提高组] 观光公交 我们想在 \(k\) 次加速每一次都取当前最优的方案加速. 考虑怎样计算对于每一条边如果在当前情况下使用加速器能够使答案减少的大小. 如果当前到达某 ...

  3. 【洛古 P1315】 [NOIP2011 提高组] 观光公交

    [NOIP2011 提高组] 观光公交 题目背景 感谢 @Transhumanist 提供的一组 Hack 数据 题目描述 风景迷人的小城 Y 市,拥有 n n n 个美丽的景点.由于慕名而来的游客越 ...

  4. 【NOIP2011 Day 2】观光公交

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

  5. NOIP2011 观光公交

    话说,我终于AC了这个题 这是一个贪心,说实话开始做的时候......完全没看出来QAQ.. 可能有人说这是个dp,但这真不是(dalao请无视) 这真的只是个贪心.... 首先对于每个点当然是能走就 ...

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

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

  7. 观光公交削弱_削弱Web开发人员和Internet的7大障碍

    观光公交削弱 As a web developer I periodically take a step back from the text editor and look at the lands ...

  8. 观光公交削弱_您的工作可能如何削弱您的技术技能

    观光公交削弱 对简单的入门和故障安全环境的渴望使开发人员感到自我破坏. 现代软件应用程序是巨大的. 甚至小型公司产品也可以由抽象的层次组成. 根据与您最紧密合作的那一层,您可能会错过很多东西. Mar ...

  9. jzxx2852观光公交

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

  10. 洛谷P1315 观光公交

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

最新文章

  1. hadoop mysql mybatis_MyBatis简介与配置MyBatis+Spring+MySql
  2. html css 显示数值_【CSS纯技术】20.03.05-CSS渲染的原理
  3. Linux下的DNS服务器搭建
  4. Java学习笔记(七)--格式化字符串及格式输出
  5. 【读书笔记】编写高质量的代码Web前端开发修炼之道——曹刘阳
  6. 趣谈设计模式 | 观察者模式(Observer) :消息的发布与订阅
  7. Redis4.0 Cluster — Centos7
  8. C#-using与添加引用的关系
  9. 张萍萍山东大学计算机科学系毕业生,并行驰骋,放“码”来战!看先导杯大奖赛上山大风采...
  10. ebtables之BROUTING和PREROUTING的redirect的区别
  11. 转:SQL SERVER中一些常见性能问题的总结
  12. 再问数据中台 - 数据中台是什么?
  13. flask导入flask-sqlalchemy的一个问题记录
  14. 网站的php主题怎么删掉,简介如何去除WordPress主题版权保护的方法 | 垃圾站
  15. 把CMD下的color 方案遍历一遍
  16. 计算机组老师颁奖词,学校优秀老师颁奖词
  17. 小米路由器显示DNS服务器设置错误,小米路由器dns异常怎么修复
  18. 程序员坐牢了,会被安排去写代码吗?
  19. 掘金新石油:金融知识图谱数据建模实战分享
  20. 暗通道理论详解及的Python实现

热门文章

  1. android动态开场,看得见的数据结构Android版之开篇前言+完篇总结
  2. 2020 05 02 记录思考
  3. 深度解析大快DKadoop大数据运维管理平台功能
  4. html语言vb怎么定义数组,vb数组的定义方法是什么
  5. 【9.8校内测试】【贪心/树规】【环覆盖问题】【线性规划】
  6. 破解华为电脑管家,多屏协同无法正常启动,提示 硬件解码器工作异常,请重启电脑
  7. 如何启用计算机网络共享,无法启用共享访问,教您无法启用共享访问怎么解决...
  8. 客户端SDK测试是什么?如何测?
  9. oracle认证考试试题及答案,oracle考试试题_oracle认证考试模拟题_oracle试题及答案房地产估价师考试试题_房地产...
  10. 一作发表6篇论文,他博三才出科研成果,厚积薄发终获成功