NOIP2011 洛谷P1315 观光公交
先解释一下数组的意义:
d[i]表示公交车从第i个点到第i+1个点需要的时间
pas结构体中:t表示这个乘客到公交站牌的时间,u表示起点,v表示终点
wait[i]表示公交车在第i个站点等待的时间
arr[i]表示到达公交车每个点的时间
reach[i]表示对于每一个点如果用加速器最多可以影响到哪一个点的乘客
sum[i]用来处理前缀和,表示从第一个点到当前点的所有乘客数量之和
解题思路:
先考虑没有加速器的情况,这时可以得到公交车到达每个点的时间
就是公交车到达前一个点的时间和乘客最晚到达的前一个点时间的最大值加上公交车到达下一个点所需要的时间:arr[i]=max(arr[i-1],wait[i-1])+d[i-1]
注意:公交车要等所有的乘客都到达站点才会出发
于是就得到了初始答案:ans=Σi=1m (arr[pas[i].v]-pas[i].t)
由于加速器会减少总的乘车时间,所以我们只需要找到如何用加速器减少更多的乘客的乘车时间,直接从初始答案中减去即可
接下来考虑在哪两个点之间加速
如果公交车到达一个点的时间早于最后一个乘客上车的时间,那么在到达这个点之前的路上把加速器都用光也不能减少目的地在这个点后面的乘客的时间,他们会被这个点的等待时间限制住(这个乘客真的烦yinQwQ)
这样就可以算出每一个间隔会加速多少个乘客
用reach[i]表示在第i个点时,如果用加速器最多可以影响到哪一个点的乘客
转移:
if(arr[i+1]>wait[i+1])
reach[i]=reach[i+1]
if(arr[i+1]≤wait[i+1])
reach[i]=i+1
根据贪心的想法,每次加速器肯定是加速乘客最多的地方,于是每次选取max1≤i≤n{sum[reach[i]]-sum[i]},其中sum[i]时目的地为i的乘客数量的前缀和
找到这个位置,把他的距离-1,然后再从答案中减去这个乘客数,重复直加速器用完或者无法加速为止
注意:每次修改距离后都要重新计算arr[i]
复杂度 O(nk)
代码:
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<time.h>
#include<queue>
using namespace std;
typedef long long ll;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
ll read(){
ll ans=;
char last=' ',ch=getchar();
while(ch<'' || ch>'')last=ch,ch=getchar();
while(ch>='' && ch<='')ans=ans*+ch-'',ch=getchar();
if(last=='-')ans=-ans;
return ans;
} int n,m,k,ans,d[],wait[],arr[],reach[],sum[];
int maxn=-; struct pass
{
int t,u,v;
}pas[]; int main()
{
n=read(),m=read(),k=read();
rep(i,,n-)
d[i]=read();
rep(i,,m)
pas[i].t=read(),pas[i].u=read(),pas[i].v=read();
rep(i,,m)
{
wait[pas[i].u]=max(wait[pas[i].u],pas[i].t);
sum[pas[i].v]+=;//分别到达每个点的人数
}
arr[]=wait[];
rep(i,,n)
{
sum[i]+=sum[i-];//前缀和
}
rep(i,,n)
arr[i]=max(arr[i-],wait[i-])+d[i-];//到达地点i的时间
rep(i,,m)
{
ans+=arr[pas[i].v]-pas[i].t;//处理初始答案
} while(k)//当还有加速器剩余时
{
--k;
reach[n]=reach[n-]=n;
int tar;
maxn=-;
per(i,n-,)
{
if(arr[i+]<=wait[i+])
reach[i]=i+;
else
reach[i]=reach[i+];
} rep(i,,n-)
{
int tmp=sum[reach[i]]-sum[i];
if(tmp>maxn&&d[i]>)
{
maxn=tmp; tar=i;
}//查找最大的乘客数量并进行标记
} ans-=maxn;//从答案中减去
d[tar]--;
rep(i,,n)
arr[i]=max(arr[i-],wait[i-])+d[i-];//重新计算arr
} cout<<ans;
}
NOIP2011 洛谷P1315 观光公交的更多相关文章
- [NOIP2011] 提高组 洛谷P1315 观光公交
题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...
- 洛谷 P1315 观光公交 —— 贪心
题目:https://www.luogu.org/problemnew/show/P1315 问题是想不明白改动一条边会对后面造成怎样的影响: 实际上影响的会是一段,当某个车站出发时间受其来人牵制时, ...
- 洛谷P1315 观光公交
SB贪心......暴露了我代码能力巨弱的本质. 题面 解:首先我们应该想到DP(但是我想到了贪心......) 然后分析题目本质,每个点有个限制,最早开走时间不得早于最晚上车时间. 然后我们就可以把 ...
- 洛谷P1315 观光公交 [noip2011D2T3] 贪心
正解:贪心 解题报告: 这里是链接! 唔我觉得还是很容易想到是贪心的,这个难就难在怎么贪心 下面列一下常见的几个贪心思想: 1)根据车上的人数排序,人最多的那条路用加速器 错误,人数多并不意味着加速的 ...
- 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交
P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...
- 【题解】洛谷P1315 [NOIP2011TG] 观光公交(前缀和+贪心)
次元传送门:洛谷P1315 思路 思路大概想到了 可是代码实现却没想到 所以参考题解了 D2T3的贪心果然有难度 我们考虑在每次用加速器有两种情况 到下一个点还需要等待:以后的时间就不再影响了 到下一 ...
- [luogu]P1315 观光公交[贪心]
[luogu]P1315 [NOIP2011]观光公交 ——!x^n+y^n=z^n 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车, ...
- 题解【洛谷P1315】[NOIP2011]观光公交
题目描述 风景迷人的小城 Y 市,拥有 \(n\) 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务. 观光公交车在第 \(0\) 分钟出现在 \( ...
- P1315 观光公交
题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...
随机推荐
- [Web 前端] 009 css 常用的文本样式设置
常用的文本 css 样式 概览 参数 释义 举例 color 设置文字的颜色 color:red; font-size 设置文字的大小 font-size:12px; font-family 设置文字 ...
- SQL基本语法和书写格式
插入 insert [into] 表名 [(列名列表)] values (值列表) insert into 新表名 (列名列表) select 列名列表 from 表名 select 表名.列名 in ...
- Hadoop Map/Reduce
Hadoop Map/Reduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集.一个Map/Reduce ...
- vscode怎么修改颜色主题里的某种颜色
我习惯用深色主题, 齿轮--->颜色主题 ---->monokai是我的菜. 比较精神,又不刺眼. 但是这个主题的注释的颜色太浅了. 几乎和背景重合. 注释很重要, 能体现和记录自己的代码 ...
- S5PV210刷机
一. 刷机初识 1.1. 什么是刷机 a. 刷机就是通过各种手段把相应镜像烧录到设备中,让设备可以运行起来.常见的刷机如:安卓刷机,QT刷机 1.2. S5PV210刷机镜像 1.2.1. 刷安卓所需 ...
- Linux下CMake简明教程
转载地址:https://blog.csdn.net/whahu1989/article/details/82078563 CMake是开源.跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本 ...
- Nginx优化总结
目录 Nginx性能优化概述 一. 压力测试工具实战 二.了解影响性能指标 三.系统性能优化 四.静态资源优化 Nginx性能优化概述 基于Nginx性能优化,那么在性能优化这一章,我们将分为如下几个 ...
- python 正则表达式教程(转)
转自:https://zhuanlan.zhihu.com/p/28920775 本节我们看一下正则表达式的相关用法,正则表达式是处理字符串的强大的工具,它有自己特定的语法结构,有了它,实现字符串的检 ...
- Vue.js 技术揭秘学习 (2) Vue 实例挂载的实现
Vue 中我们是通过 $mount 实例方法去挂载 vm 的 $mount 方法实际上会去调用 mountComponent 方法,mountComponent 核心就是先实例化一个渲染Watcher ...
- css3 first-of-type选择器以及css3选择器中:first-child与:first-of-type的区别
CSS3 first-of-type选择器 “:first-of-type”选择器类似于“:first-child”选择器,不同之处就是指定了元素的类型,其主要用来定位一个父元素下的某个类型的第一个子 ...