题目传送门


先解释一下数组的意义:

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 观光公交的更多相关文章

  1. [NOIP2011] 提高组 洛谷P1315 观光公交

    题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...

  2. 洛谷 P1315 观光公交 —— 贪心

    题目:https://www.luogu.org/problemnew/show/P1315 问题是想不明白改动一条边会对后面造成怎样的影响: 实际上影响的会是一段,当某个车站出发时间受其来人牵制时, ...

  3. 洛谷P1315 观光公交

    SB贪心......暴露了我代码能力巨弱的本质. 题面 解:首先我们应该想到DP(但是我想到了贪心......) 然后分析题目本质,每个点有个限制,最早开走时间不得早于最晚上车时间. 然后我们就可以把 ...

  4. 洛谷P1315 观光公交 [noip2011D2T3] 贪心

    正解:贪心 解题报告: 这里是链接! 唔我觉得还是很容易想到是贪心的,这个难就难在怎么贪心 下面列一下常见的几个贪心思想: 1)根据车上的人数排序,人最多的那条路用加速器 错误,人数多并不意味着加速的 ...

  5. 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交

    P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...

  6. 【题解】洛谷P1315 [NOIP2011TG] 观光公交(前缀和+贪心)

    次元传送门:洛谷P1315 思路 思路大概想到了 可是代码实现却没想到 所以参考题解了 D2T3的贪心果然有难度 我们考虑在每次用加速器有两种情况 到下一个点还需要等待:以后的时间就不再影响了 到下一 ...

  7. [luogu]P1315 观光公交[贪心]

    [luogu]P1315 [NOIP2011]观光公交 ——!x^n+y^n=z^n 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车, ...

  8. 题解【洛谷P1315】[NOIP2011]观光公交

    题目描述 风景迷人的小城 Y 市,拥有 \(n\) 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务. 观光公交车在第 \(0\) 分钟出现在 \( ...

  9. P1315 观光公交

    题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...

随机推荐

  1. mysql使用触发器生成唯一订单号,

    需求:订单号唯一,并且期望是时间格式加其他字符串, 实现:采用触发机制,在新增时根据新增id值加1作为订单生成的随机且确定唯一的数,因为id唯一: 遇到问题:新增时不能提前知道id值, 解决:取到当前 ...

  2. POJ-2456.Aggressivecows.(二分求解最大化最小值)

    本题大意:在坐标轴上有n个点,现在打算在这n个点上建立c个牛棚,由于牛对厂主的分配方式表示很不满意,它很暴躁,所以它会攻击离它很近的牛来获得快感,这件事让厂主大大知道了,他怎么可能容忍?所以他决定有策 ...

  3. HTML5随记

    1.浏览器加载HTML的过程是从上至下,因此引用的第三方js文件一定要放到自己定义的js文件的前面,否则引入的js文件将会在加载时失效. 2.html的全局属性包括:accesskey.content ...

  4. Appium+Python之生成html测试报告

    思考:测试用例执行后,如何生成一个直观漂亮的测试报告呢? 分析:1.unittest单元测试框架本身带有一个textTestRunner类,可以生成txt文本格式的测试报告,但是页面不够直观 2.我们 ...

  5. RMQ 的入门 hdu1806

    RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干次询问RMQ(i,j),返回数列A中下标在区间[i,j]中的最小/大值 ...

  6. 一些WinAPI 处理 字符的函数和连接(GetACP和SetThreadLocale最重要,还有SetConsoleCP)

    虽然东西都是现成的.但是也要脑子里有个概念. // 地区与语言GetACP 取得 ANSI code page,法语XP+设置中文内核 = 936 // ShowMessage(IntToStr(Ge ...

  7. LOJ 3175. 「IOI2019」排列鞋子

    传送门 考虑如果能确定每个鞋子最终交换到的位置,那么答案容易算出 具体地,如果原位置为 $i$ 的鞋子要交换到 $pos[i]$ 那么最终答案就是 $pos$ 的逆序对数量 如果不懂可以先去写 NOI ...

  8. mysql数据同步到Elasticsearch

    1.版本介绍 Elasticsearch: https://www.elastic.co/products/elasticsearch 版本:2.4.0   Logstash: https://www ...

  9. overflow hidden 遇上absolute失效

    原文地址 背景 这几天开发的时候遇到了个问题,如图1. 写了个demo 由于页面并没有进行整体缩放,导致在小屏幕手机上显示会有异常.PM要求能够显示最后一个完整的标签. 当在iPhone5手机上查看页 ...

  10. 如何修改Pspice元件库中元件的模型参数?

    比如下面是我取出的一个稳压管参数....* created using Parts release 7.1p on 11/03/98 * per Microsemi estimate: Trr(est ...