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 ...
随机推荐
- python基础-3 集合 三元运算 深浅拷贝 函数 Python作用域
上节课总结 1 运算符 in 字符串 判断 : “hello” in "asdasfhelloasdfsadf" 列表元素判断:"li" in ['li', ...
- web 前端2 html css一些小问题技巧
html css一些小问题技巧 1 对于儿子块float后,父亲块如果没内容就不见了,如何让父亲块依然跟随飘起了的儿子块撑起来呢?? 用到的属性after方法 公共方法作为继承即可. 1.1 方法 ...
- Consul集群Server+Client模式
Consul集群Server+Client模式 架构示意图 只使用Consul的Server模式有以下2个问题: 因为Consul Server数量受到控制所以压力承载(扩展性)是个问题. Serve ...
- Spring-Boot 整合Dubbo 解决@Reference 注解为null情况
首先检查一下你的spring boot版本是多少? 如果是2.X 不用看了,spring boot 2.x 必定会出现这个问题, 改为 1.5.9 或其他1.x版本,目前生产环境建议使用1.x版本. ...
- 【洛谷 p2672】推销员
推销员[题目链接] 好了为了凑字数先把题目复制一下: 好了题解第一篇正解: 首先输入,莫得什么好说的: scanf("%d",&n); ;i<=n;i++) scan ...
- HDU-1847 Good Luck in CET-4 Everybody! (博弈+找规律)
大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此.当然,作为在考场浸润了十几载的当代大学生,Kiki和Cici更懂得考 ...
- Codeforces - 1199D - Welfare State - 单调栈 / 线段树
https://codeforc.es/contest/1199/problem/D 其实后来想了一下貌似是个线段树的傻逼题. 单调栈是这样思考的,每次单点修改打上一个最终修改的时间戳.每次全体修改就 ...
- P4643 [国家集训队]阿狸和桃子的游戏
传送门 这题看一眼就很不可做 考虑对于任意一个最终状态,对于一条边的贡献分成三种情况 如果此边连接的两点属于 $A$,那么对 $A$ 的贡献就是边权 $w$,即对答案的贡献为 $+w$ 如果两点都属于 ...
- Linux安装软件-CentOS和Ubuntu介绍
开发十年,就只剩下这套架构体系了! >>> 不同Linux发行版的软件安装会有不同的方式,其中CentOS安装软件的主要方式是rpm和yum,Ubuntu可以使用apt-get, ...
- CSS中如何设置父元素透明度不影响子元素透明度
原因分析: 使用css的opcity属性改变某个元素的透明度,但是其元素下的子元素的透明度也会被改变,即便重定义也没有用,不过有个方法可以实现,大家可以看看. 可以使用一张透明的图片做背景可以达成效果 ...