【NOIP2011 Day 2】观光公交
【问题描述】
小城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[20000]; int n,m,K,ans; int f[20000],Time[20000],g[20000],dist[20000],sum[20000]; int main() {scanf("%d %d %d",&n,&m,&K);for (int i = 1;i < n;i ++)scanf("%d",&dist[i]);for (int i = 1;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 = 2;i <= n;i ++)sum[i] += sum[i - 1];Time[1] = 0;for (int i = 2;i <= n;i ++)Time[i] = max(Time[i - 1],f[i - 1]) + dist[i - 1];for (int i = 1;i <= m;i ++)ans += Time[a[i].target] - a[i].arrive;while (K){g[n] = n;g[n - 1] = n;for (int i = n - 2;i ; i -- ){if (Time[i + 1] <= f[i + 1])g[i] = i + 1;else g[i] = g[i + 1];}int Max = 0,j;for (int i = 1;i <= n;i ++)if (sum[g[i]] - sum[i] > Max && dist[i] > 0)Max = sum[g[i]] - sum[i],j = i;if (!Max) break;ans -= Max;dist[j] --;K --;Time[1] = 0;for (int i = 2;i <= n;i ++)Time[i] = max(Time[i - 1],f[i - 1]) + dist[i - 1];}cout << ans; }
转载于:https://www.cnblogs.com/N-C-Derek/p/3371058.html
【NOIP2011 Day 2】观光公交相关推荐
- 【做题记录】[NOIP2011 提高组] 观光公交
P1315 [NOIP2011 提高组] 观光公交 我们想在 \(k\) 次加速每一次都取当前最优的方案加速. 考虑怎样计算对于每一条边如果在当前情况下使用加速器能够使答案减少的大小. 如果当前到达某 ...
- 【洛古 P1315】 [NOIP2011 提高组] 观光公交
[NOIP2011 提高组] 观光公交 题目背景 感谢 @Transhumanist 提供的一组 Hack 数据 题目描述 风景迷人的小城 Y 市,拥有 n n n 个美丽的景点.由于慕名而来的游客越 ...
- Luogu 1315 【NOIP2011】观光公交 (贪心)
Luogu 1315 [NOIP2011]观光公交 (贪心) Description 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供 ...
- [luogu]P1315 观光公交[贪心]
[luogu]P1315 [NOIP2011]观光公交 --!x^n+y^n=z^n 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车, ...
- 观光公交削弱_削弱Web开发人员和Internet的7大障碍
观光公交削弱 As a web developer I periodically take a step back from the text editor and look at the lands ...
- 观光公交削弱_您的工作可能如何削弱您的技术技能
观光公交削弱 对简单的入门和故障安全环境的渴望使开发人员感到自我破坏. 现代软件应用程序是巨大的. 甚至小型公司产品也可以由抽象的层次组成. 根据与您最紧密合作的那一层,您可能会错过很多东西. Mar ...
- NOIP2011 观光公交
话说,我终于AC了这个题 这是一个贪心,说实话开始做的时候......完全没看出来QAQ.. 可能有人说这是个dp,但这真不是(dalao请无视) 这真的只是个贪心.... 首先对于每个点当然是能走就 ...
- jzxx2852观光公交
题目描述 风景迷人的小城 Y 市,拥有 n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1 号景点,随后依次前 ...
- 洛谷P1315 观光公交
SB贪心......暴露了我代码能力巨弱的本质. 题面 解:首先我们应该想到DP(但是我想到了贪心......) 然后分析题目本质,每个点有个限制,最早开走时间不得早于最晚上车时间. 然后我们就可以把 ...
最新文章
- POJ2387 Til the Cows Come Home -DIJKSTRA 练习
- 一套基于 SpringBoot 的完整高并发电商系统,拿去面试简直不要太好用!
- [原] 64位win7编译OpenCV SVN版本
- 在Java中实现单例模式的有效方法是什么? [关闭]
- 高糊视频秒变4K,速度比TecoGAN快了9倍!东南大学提出新的视频超分辨率系统
- javaweb乱码以及ajax乱码
- ImageLoader displayers 之CircleBitmapDisplayer
- WinMain中的Console与main中的Window
- vue 字符串分割_嗯哼vue组件taginput包教不包会
- MYSQL中的BlackHole引擎
- Python 集合(set) 介绍
- 优秀logo设计解析_优秀Logo设计!字母造型解析
- 详解python输出语句print
- 计算机程序设计语言有哪几类,计算机程序设计语言可以分为哪三类?
- PC版Android系统声卡驱动,android下调试声卡驱动之概述
- 扫描枪取消回车二维码_扫码枪设置自动回车方法步骤,条码扫描枪不自动回车怎么办...
- Hack the box -- 靶机渗透测试(TIER2)
- Ubuntu论坛遭到入侵 用户数据泄露
- 武神主宰中的科幻理论体系设定
- 谈谈8583报文的使用及测试
热门文章
- 《ArcGis地图数据资料》(DataMap)ArcGis 9.0
- 哇靠靠,这也行?零基础DIY无人驾驶小车(一)
- 在python中操作excel
- C语言高级编程:如何确定一个变量是有符号还是无符号数
- 详解python3如何调用c语言代码
- Java入门:冒泡排序
- Linux-Android系统启动之INIT进程和system v init
- php5.5 连接数据库,php5.5 session_set_save_handler 连接数据库问题
- easyui一行显示多行_easyui datagrid以及oracle中的多行合并一行
- 三菱a系列motion软体_三菱M70A/64SM重要功能比较