题目传送门


先解释一下数组的意义:

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. PS把一张白色背景的图片设为透明

    方法一: 1.双击图层缩略图上的小锁图标(注意,这里不要拖动小锁进行删除锁定),弹出“新建图层”,确定 2.右键左侧第四个功能菜单,选择魔棒工具 3.用魔棒工具在白色背景区域点击一下,选中白色区域背景 ...

  2. xmake v2.1.5版本新特性介绍

    2.1.5版本现已进入收尾阶段,此版本加入了一大波新特性,目前正在进行稳定性测试和修复,在这里,先来介绍下新版本中引入了哪些新特性和改进. 1. 提供类似cmake的find_*系列接口,实现各种查找 ...

  3. py基础

    基本语句和函数等练习,知识点都在代码里... """ a = int(input('a = ')) b = int(input('b = ')) print('%d + ...

  4. java类从加载、连接到初始化过程

    类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用. 每个类编译后产生一个Class对象,存储在.class文件中,JV ...

  5. [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)

    [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...

  6. C++ 函数返回对象时并没有调用拷贝构造函数

    #include <iostream> #include <vector> #include <string.h> using namespace std; cla ...

  7. 机器学习ROC图解读

    1. 分类器评估指标 对于二分类问题,可将样例根据其真实类别和分类器预测类别划分为:真正例(True Positive,TP):真实类别为正例,预测类别为正例.假正例(False Positive,F ...

  8. 7、前端知识点--关于Array.from详解

    1.Array.from()方法就是将一个类数组对象 或 可遍历对象 或 可迭代对象 转换成一个真正的数组.浅拷贝的数组实例. 2.那么,什么是类数组对象呢?所谓类数组对象,最基本的要求就是具有len ...

  9. 《快学scala》读书笔记(1)

    第一章 基础 1.安装scala解释器 (1)scala-2.12.1.msi (2)配置环境变量:SCALA_HOME = D:\Program Files\scala Path= %SCALA_H ...

  10. latex算法步骤如何去掉序号

    想去掉latex算法步骤前面的序号,如下 我想去掉每个算法步骤前面的数字序号,1,2,3,因为我已经写了step.我们只需要引用a lgorithmic这个包就可以了,代码如下: \usepackag ...