题解【洛谷P1315】[NOIP2011]观光公交
题目描述
风景迷人的小城 Y 市,拥有 \(n\) 个美丽的景点。由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务。
观光公交车在第 \(0\) 分钟出现在 \(1\) 号景点,随后依次前往 \(2,\) \(3,\) \(\dots,\) \(n\) 号景点。从第 \(i\) 号景点开到第 \(i+1\) 号景点需要 \(D_i\) 分钟。任意时刻,公交车只能往前开,或在景点处等待。
设共有 \(m\) 个游客,每位游客需要乘车 \(1\) 次从一个景点到达另一个景点,第 \(i\) 位游客在 \(T_i\) 分钟来到景点 \(A_i\),希望乘车去景点 \(B_i\) \((A_i<B_i)\)。为了使所有乘客都能顺利到达目的地,公交车在每站都必须等待需要从该景点出发的所有乘客都上车后才能出发开往下一景点。假设乘客上下车不需要时间。
一个乘客的旅行时间,等于他到达目的地的时刻减去他来到出发地的时刻。因为只有一辆观光车,有时候还要停下来等其他乘客,乘客们纷纷抱怨旅行时间太长了。于是聪明的司机 ZZ 给公交车安装了 \(k\) 个氮气加速器,每使用一个加速器,可以使其中一个 \(D_i\) 减 \(1\)。对于同一个 \(D_i\) 可以重复使用加速器,但是必须保证使用后 \(D_i\geq0\)。
那么 ZZ 该如何安排使用加速器,才能使所有乘客的旅行时间总和最小?
输入格式
第 \(1\) 行是 \(3\) 个整数 \(n, m, k\),每两个整数之间用一个空格隔开。分别表示景点数、乘客数和氮气加速器个数。
第 \(2\) 行是 \(n-1\) 个整数,每两个整数之间用一个空格隔开,第 \(i\) 个数表示从第 \(i\) 个景点开往第 \(i+1\) 个景点所需要的时间,即 \(D_i\) 。
第 \(3\) 行至 \(m+2\) 行每行 \(3\) 个整数 \(T_i, A_i, B_i\),每两个整数之间用一个空格隔开。第 \(i+2\) 行表示第 \(i\) 位乘客来到出发景点的时刻,出发的景点编号和到达的景点编号。
输出格式
一个整数,表示最小的总旅行时间。
输入输出样例
样例输入
3 3 2
1 4
0 1 3
1 1 2
5 2 3
样例输出
10
样例说明
对 \(D_2\) 使用 \(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 \leq n \leq 50\),\(m \leq 1000\),\(k \leq 20\),\(D_i \leq 10\),\(T_i \leq 500\);
对于 \(60\%\) 的数据,\(n \leq 100\),\(m \leq 1000\),\(k \leq 100\),\(T_i \leq 10^4\);
对于 \(100\%\) 的数据,\(n \leq 1000\),\(m \leq 10^4\),\(k \leq 10^5\),\(D_i \leq 100\),\(T_i\leq 10^5\);
noip2011提高组day2第3题
题解
贪心经典题。
很容易就可以想到,贪心策略就是每次选择人数最多的站点使用氮气加速,此处证明显然。
我们先求出没有任何氮气加速时的答案\((k=0)\),可以使用递推求解。
然后,循环\(k\)次,每次找到经过人数最多的站点,并且将到达后面的站点的时间\(-1\)。
最后统计答案输出即可。
分析一下复杂度:
循环\(k\)次,每次循环需要\(n^2\)找到人数最多的站点,复杂度为\(\mathcal{O}(k \times n^2)\),可以通过\(60 \%\)的数据点。
想办法优化。
我们注意到,每到达一个站点,公交车都会等人来了再走。
于是,我们直接在出现车等人的情况时\(\mathrm{break}\),虽然这样的时间复杂度依然是\(\mathcal{O}(k \times n^2)\),但是远远达不到这个上界,最慢的测试点只跑了\(\mathrm{311\ ms}\)。
具体实现可以参考代码。
代码
/********************************
Author: csxsl
Date: 2019/10/28
Language: C++
********************************/
#include <bits/stdc++.h>
#define itn int
#define gI gi
using namespace std;
inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return f * x;
}
inline long long gl()
{
long long f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return f * x;
}
const int maxn = 1003;
int n, m, k, d[maxn];
struct people//记录人
{
int kaishi/*到达开始站点的时间*/, chufabianhao/*出发点的编号*/, daodabianhao/*到达点的编号*/;
} a[maxn];
struct zhandian//记录每个站点
{
int daoda/*到达这个站点的时间*/, zuiwan/*最晚到达这个站点的人的时间*/, person/*要到达这个站点的人数*/;
} b[maxn];
int main()
{
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
n = gi(), m = gi(), k = gI();
for (int i = 1; i < n; i+=1) d[i] = gi();
for (int i = 1; i <= m; i+=1)
{
a[i].kaishi = gi(), a[i].chufabianhao = gi(), a[i].daodabianhao = gi();
++b[a[i].daodabianhao].person;//记录人数
b[a[i].chufabianhao].zuiwan = max(b[a[i].chufabianhao].zuiwan, a[i].kaishi);//更新最短到达这个站点的时间
}
int wudan_time = 0;//记录没有氮气加速时的用时
for (int i = 1; i <= n; i+=1)
{
b[i].daoda = wudan_time;//存储到达时间
wudan_time = max(wudan_time, b[i].zuiwan) + d[i];//进行递推
}
while (k--)//循环k次
{
int max_person = 0/*最多的人数*/, max_zhandian = 0/*最多人数的站点编号*/;
for (int i = 2; i <= n; i+=1)
{
if (!d[i - 1]) continue;//d值已经为0了,就continue,因为题目中要求d[i]>=0
int now_person = 0;//记录这个站点使用氮气加速会对多少个人造成影响
for (int j = i; j <= n; j+=1)
{
now_person += b[j].person;
if (b[j].daoda <= b[j].zuiwan) break;//出现了车等人就直接break退出
}
if (now_person > max_person)//更新答案
{
max_person = now_person;
max_zhandian = i;//进行记录
}
}
--d[max_zhandian - 1];//修改d值
for (int i = max_zhandian; i <= n; i+=1)
{
--b[i].daoda;//对之后每个站点到达的时间进行修改
if (b[i].daoda < b[i].zuiwan) break;//出现了车等人,直接退出
}
}
int ans = 0;
for (int i = 1; i <= m; i+=1)
{
ans += b[a[i].daodabianhao].daoda - a[i].kaishi;//记录答案为车到达他要到的终点的时间减去他到达开始站点的时间
}
printf("%d\n", ans);//输出
return 0;//结束
}
题解【洛谷P1315】[NOIP2011]观光公交的更多相关文章
- 【题解】洛谷P1315 [NOIP2011TG] 观光公交(前缀和+贪心)
次元传送门:洛谷P1315 思路 思路大概想到了 可是代码实现却没想到 所以参考题解了 D2T3的贪心果然有难度 我们考虑在每次用加速器有两种情况 到下一个点还需要等待:以后的时间就不再影响了 到下一 ...
- 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交
P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...
- NOIP2011 观光公交 加强版
传送门 题目大意 给定从左到右的$n$个车站以及两两之间通行的需要的时间. 有$m$个人,第$i$个人会在$T_i$时刻出现在$a_i$车站,目的地是$b_i$. 一辆车第$0$时刻出现在一号站台,从 ...
- 题解 洛谷P5018【对称二叉树】(noip2018T4)
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- 题解-洛谷P4229 某位歌姬的故事
题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...
- 题解-洛谷P4724 【模板】三维凸包
洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...
- 题解-洛谷P4859 已经没有什么好害怕的了
洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...
- 题解-洛谷P5217 贫穷
洛谷P5217 贫穷 给定长度为 \(n\) 的初始文本 \(s\),有 \(m\) 个如下操作: \(\texttt{I x c}\),在第 \(x\) 个字母后面插入一个 \(c\). \(\te ...
随机推荐
- 2020牛客寒假算法基础集训营4-I 匹配星星【贪心】
链接:https://ac.nowcoder.com/acm/contest/3005/I来源:牛客网 示例1 输入 复制 2 1 1 0 2 2 1 2 1 1 0 2 2 1 输出 复制 1 1 ...
- GYCTF easy_thinking
前期储备:ThinkPHP6 任意文件操作漏洞分析 https://paper.seebug.org/1114/ 学习链接: https://www.freebuf.com/articles/web/ ...
- 《你不知道的javascript(上)》笔记
作用域是什么 编译原理 分词/词法分析 这个过程会将由字符组成的字符串分解成(对编程语言来说)有意义的代码块,这些代码块被称为词法单元 解析/语法分析 词法单元流(数组)转换成一个由元素逐级嵌套所组成 ...
- Gin_中间件
gin可以构建中间件,但它只对注册过的路由函数起作用 对于分组路由,嵌套使用中间件,可以限定中间件的作用范围 中间件分为全局中间件,单个路由中间件和群组中间件 gin中间件必须是一个 gin.Hand ...
- Appium学习2-Appium-desktop的使用
安装: 下载路径:https://github.com/appium/appium-desktop/releases 选择最新的安装包即可. 使用 1.点击打开应用程序,进入到配置项. 2.配置以下信 ...
- Appium+python自动化-元素定位uiautomatorviewer的使用
前言 环境搭建好了,下一步元素定位,元素定位本篇主要介绍如何使用uiautomatorviewer,通过定位到页面上的元素,然后进行相应的点击等操作. uiautomatorviewer是androi ...
- Java-杨辉三角(YangHuiTriangle)
杨辉三角,是二项式系数在三角形中的一种几何排列. 杨辉三角概述 ☃ 每行端点与结尾的数为1 ☃ 每个数等于它上方两数之和 ☃ 每行数字左右对称,由1开始逐渐变大 ☃ 第n行的数字有n项 ☃ 前n行共[ ...
- android studio编译包真机安装失败解决方案记录
Android studio升级到3.0之后,编译的APK文件无法在真机上安装,提示安装失败,最开始以为是API版本过高,与手机的版本不兼容,然后降低API,结果依然是安装失败. 然后连接手机,直接调 ...
- SequoiaDB巨杉数据库入门:快速搭建流媒体服务器
使用SequoiaDB的分布式文件系统搭建流媒体服务器 介绍 如今使用移动互联网的年轻人开始越来越多使用短视频展示自我,而流媒体则是支撑在线视频播放的核心技术.当我们开始构建流媒体站点时,往往面临最大 ...
- bugku sql2
sql注入2 200 http://123.206.87.240:8007/web2/ 全都tm过滤了绝望吗? 提示 !,!=,=,+,-,^,%