【问题描述】

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

  对于100%的数据,1≤n≤1,000,1≤m≤10,000,0≤k≤100,000,0≤Di ≤100,0≤Ti≤100,000。

【分析】

  设t[i]表示来到第i个景点的乘客最晚的时间,time[i]表示车到达第i个景点的最小时间。

  因为每个乘客到达的时间已经固定,所以要使总时间最小,就是使Σtime[b[i]]最小,其中b[i]代表每位乘客的目的地。

  先考虑不用加速器的情况。可以直接递推求出答案,time[i] = max(time[i - 1],t[i - 1]) + d[i - 1];

  接下来再来考虑使用加速器减少的时间。对于每个加速器,我们必须使这个加速器获得最大的效益,即使尽可能多的乘客旅行时间减一。如果我们在i到i + 1间使用加速器的话,那么到i + 1站的乘客的旅行时间都会减一,但是如果time[i + 1]小于t[i + 1]的话,车就要在i + 1站等到t[i + 1]所有的乘客上车,在i + 1站以后下车的乘客的时间是一样的,也就是说这个加速器对后面下车的乘客没有影响。我们可以用递推求出每个i最远能影响的车站。

  g[i] = g[i + 1]    (time[i + 1] > t[i + 1])

  g[i] = i + 1 (time[i + 1] <= t[i + 1])

  那么,我们用一个加速器所能减少一个单位时间的乘客就是sum[g[i]] - sum[i],每次找出使这个最大的i即可。然后把ans减掉,维护time,g

  这题说白了就是贪心。加速器的使用各不影响。易知这个贪心是正确的。

  代码还是比较好写的。

【代码】

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
int start,arrive,target;
}a[];
int n,m,K,ans;
int f[],Time[],g[],dist[],sum[];
int main()
{
scanf("%d %d %d",&n,&m,&K);
for (int i = ;i < n;i ++)
scanf("%d",&dist[i]);
for (int i = ;i <= m;i ++)
{
scanf("%d %d %d",&a[i].arrive,&a[i].start,&a[i].target);
f[a[i].start] = max(f[a[i].start],a[i].arrive);
sum[a[i].target] ++ ;
}
for (int i = ;i <= n;i ++)
sum[i] += sum[i - ]; Time[] = ;
for (int i = ;i <= n;i ++)
Time[i] = max(Time[i - ],f[i - ]) + dist[i - ];
for (int i = ;i <= m;i ++)
ans += Time[a[i].target] - a[i].arrive; while (K)
{
g[n] = n;
g[n - ] = n;
for (int i = n - ;i ; i -- )
{
if (Time[i + ] <= f[i + ])
g[i] = i + ;
else g[i] = g[i + ];
}
int Max = ,j;
for (int i = ;i <= n;i ++)
if (sum[g[i]] - sum[i] > Max && dist[i] > )
Max = sum[g[i]] - sum[i],j = i;
if (!Max) break;
ans -= Max;
dist[j] --;
K --;
Time[] = ;
for (int i = ;i <= n;i ++)
Time[i] = max(Time[i - ],f[i - ]) + dist[i - ];
}
cout << ans;
}

【NOIP2011 Day 2】观光公交的更多相关文章

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

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

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

    考虑这类每次都有一类物品贡献相同的物品,求使用了 \(k\) 个物品的最优值,则有考虑考虑贪心. 每次找到一个车到的时间\(>\)最后一个人到的时间,那么找一个覆盖个数最大的地方使用它.

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

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

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

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

  5. NOIP2011 观光公交

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

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

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

  7. vijos1741 观光公交 (贪心)

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

  8. noip 2011观光公交

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

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

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

  10. NOIP观光公交

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

随机推荐

  1. mui图片懒加载

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  2. C#调用FFMPEG实现桌面录制(视频+音频+生成本地文件)

    不得不说FFMPEG真是个神奇的玩意,所接触的部分不过万一.网上有个很火的例子是c++方面的,当然这个功能还是用c++来实现比较妥当. 然而我不会c++ 因为我的功能需求比较简单,只要实现基本的录制就 ...

  3. 我的最爱Lambda演算——开篇

    (在这个帖子的原始版本里,我试图用一个JavaScript工具来生成MathML.但不太顺利:有几个浏览器没法正确的渲染,在RSS feed里也显示的不好.所以我只好从头开始,用简单的文本格式重新写一 ...

  4. jsonp的作用

    jsonp(即JSON with padding),也就是json填充. 背景: json格式的数据对比xml格式的数据,性能上已经有了很大的提升.但是json可以被本地执行仍然会导致几个重要的性能问 ...

  5. python tips:小整数对象池与字符串intern

    本文为is同一性运算符的详细解释.is用于判断两个对象是否为同一个对象,具体来说是两个对象在内存中的位置是否相同. python为了提高效率,节省内存,在实现上大量使用了缓冲池技术和字符串intern ...

  6. mongodb多实例部署

    安装与管理MongoDB 1.安装解压源码包 [root@bogon ~]# tar xf mongodb-linux-x86_64-rhel70-4.0.6.tgz [root@bogon ~]# ...

  7. 自编码器----Autoencoder

    一.自编码器:降维[无监督学习] PCA简介:[线性]原矩阵乘以过渡矩阵W得到新的矩阵,原矩阵和新矩阵是同样的东西,只是通过W换基. 自编码: 自动编码器是一种无监督的神经网络模型,它可以学习到输入数 ...

  8. P1125 笨小猴

    P1125 笨小猴 标签:NOIp提高组 2008 云端 难度:普及- 时空限制:1s / 128MB 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证 ...

  9. nyoj113-字符串替换

    字符串替换 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 编写一个程序实现将字符串中的所有"you"替换成"we" 输入 输入包 ...

  10. Codeforces 912A/B

    A. Tricky Alchemy 传送门:http://codeforces.com/contest/912/problem/A 参考程序如下: #include <stdio.h> # ...