【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[];
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】观光公交的更多相关文章
- 【做题记录】[NOIP2011 提高组] 观光公交
P1315 [NOIP2011 提高组] 观光公交 我们想在 \(k\) 次加速每一次都取当前最优的方案加速. 考虑怎样计算对于每一条边如果在当前情况下使用加速器能够使答案减少的大小. 如果当前到达某 ...
- [NOIP2011 提高组] 观光公交
考虑这类每次都有一类物品贡献相同的物品,求使用了 \(k\) 个物品的最优值,则有考虑考虑贪心. 每次找到一个车到的时间\(>\)最后一个人到的时间,那么找一个覆盖个数最大的地方使用它.
- Luogu 1315 【NOIP2011】观光公交 (贪心)
Luogu 1315 [NOIP2011]观光公交 (贪心) Description 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供 ...
- 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交
P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...
- NOIP2011 观光公交
3.观光公交 (bus.cpp/c/pas) 风景迷人的小城 Y 市,拥有 n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特 意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 ...
- luoguP1315 观光公交 题解(NOIP2011)(贪心)
P1315 观光公交 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cm ...
- vijos1741 观光公交 (贪心)
https://www.vijos.org/p/1741 P1741观光公交 请登录后递交 标签:NOIP提高组2011[显示标签] 描述 风景迷人的小城Y市,拥有n个美丽的景点.由于慕名而来的游 ...
- noip 2011观光公交
P1315 观光公交 95通过 244提交 题目提供者该用户不存在 标签贪心递推2011NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 风景迷人的小城Y 市,拥有n 个美 ...
- [luogu]P1315 观光公交[贪心]
[luogu]P1315 [NOIP2011]观光公交 ——!x^n+y^n=z^n 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车, ...
- NOIP观光公交
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #inc ...
随机推荐
- Linux rsync配置用于服务器之间传输大量的数据
Linux的rsync 配置,用于服务器之间远程传大量的数据 [教程主题]:rsync [课程录制]: 创E [主要内容] [1] rsync介绍 Rsync(Remote Synchronize ...
- POJ_2063_完全背包
Investment Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10090 Accepted: 3540 Descr ...
- C# 截取字符串基本
#region --构建字符串处理 string str1 = "123AAA456AAAA789AAAAAAA1011"; string str2 = "1234567 ...
- 【Python基础】while循环语句
Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务.其基本形式为: while 判断条件: 执行语句…… 执行语句可以是单个语句或语句 ...
- Vue2 封装的 Quill 富文本编辑器组件 Vue-Quill-Editor
1.安装 npm install vue-quill-editor --save 2.使用 import { quillEditor } from 'vue-quill-editor' 3.组件中 & ...
- 复习MySQL④查询功能、连接方式、联合查询
用select语句查询: select〈目标列组〉 from〈数据源〉 [where〈元组选择条件〉] [group by〈分列组〉[having 〈组选择条件〉]] [order by〈排序列1〉〈 ...
- 字符串函数(day11)
使用存储区的地址作为返回值可以让调用 函数使用被调用函数的存储区 这种时候被调用函数需要提供一个指针类型 的存储区记录作为返回值的地址数据 不可以把非静态局部变量的地址作为返回值 使用 C语言里的文字 ...
- 将RedHat的yum更换为CentOS的yum
CentOS6.8 脚本: #安装yum所需的包已经下载到本地 #!/bin/bashrpm -qa | grep yum | xargs rpm -e --nodepsrm -rf /etc/yum ...
- apache+php连接数据库
######## 安装APACHE ##############安装apr/usr/src/apache+php/tar xf apr-1.5.2.tar.gzcd apr-1.5.2./config ...
- 0807再整理SQL执行流程
转自http://www.cnblogs.com/annsshadow/p/5037667.html MySQL架构总览->查询执行流程->SQL解析顺序 前言: 一直是想知道一条SQ ...