$Noip2011/Luogu1315$ 观光公交 贪心
$Sol$
觉得这题贪心要想很多事情,不适合我这种没脑子选手$ovo$.看题解还理解了很久.
最开始是这样想的:把所有的路段上的乘客按大小排个序用加速器就好了,这个想法被自己轻松$hack.$因为,假如一个路段的终点没人下车而且又要等乘客很久才能出发,那前面用加速器也没意义了.由这个反例似乎可以推出用$1$个加速器能减少的时间?由这个起点向后枚举点,看用了加速器到达后是否还需要等乘客,如果不是,那么这个加速器对于这站下车的乘客就是有帮助的.由此也可以看出用加速器之后可能会对后面的出发时间有影响,这里需要一个变量来维护.
具体来说:
$off[i]$表示第$i$站下车的乘客数量.
$arr[i]$表示第$i$站乘车的乘客的最晚到达时间.
$dd[i]$表示汽车到达$i$站的时间.
$d[i]$表示第$i$站到第$i+1$站所需要的时间.
$dd[i]=max(dd[i-1],arr[i-1])+d[i-1].$
$aff[i]$表示假设$(i,i+1)$这段路程所需时间减少$1$,那么在$aff[i]$下站的人是最后的受益者.
差不多就是维护上面的变量就好了,具体看代码叭.
$Code$
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define il inline
#define Rg register
#define go(i,a,b) for(Rg int i=a;i<=b;++i)
#define yes(i,a,b) for(Rg int i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))
#define int long long
#define db double
#define inf 2147483647
using namespace std;
il int read()
{
Rg int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
const int N=;
int n,m,k,as,off[N],arr[N],dd[N],sum[N],d[N],aff[N];
struct node{int t,u,v;}a[N*];
main()
{
n=read(),m=read(),k=read();
go(i,,n-)d[i]=read();
go(i,,m)
{
a[i]=(node){read(),read(),read()};
off[a[i].v]++;
arr[a[i].u]=max(arr[a[i].u],a[i].t);
}
go(i,,n)dd[i]=max(dd[i-],arr[i-])+d[i-];
go(i,,n)sum[i]=sum[i-]+off[i];
go(i,,m)as+=dd[a[i].v]-a[i].t;
arr[n]=inf;
while(k--)
{
int maxs=,qwq=;
yes(i,n-,)
if(dd[i+]>arr[i+])aff[i]=aff[i+];
else aff[i]=i+;
go(i,,n-)
if(sum[aff[i]]-sum[i]>maxs&&d[i])
maxs=sum[aff[i]]-sum[i],qwq=i;
as-=maxs;d[qwq]-=;
go(i,,n)dd[i]=max(dd[i-],arr[i-])+d[i-];
}
printf("%lld\n",as);
return ;
}
随机推荐
- oracle函数 current_date
[功能]:返回当前会话时区中的当前日期 [参数]:没有参数,没有括号 [返回]:日期 [示例]select current_date from dual; 返回:2008-11-14
- etcd 在超大规模数据场景下的性能优化
作者 | 阿里云智能事业部高级开发工程师 陈星宇(宇慕) 概述 etcd是一个开源的分布式的kv存储系统, 最近刚被cncf列为沙箱孵化项目.etcd的应用场景很广,很多地方都用到了它,例如kuber ...
- Websocket 简单对话:静态网页与pycharm对话
WebSocket websocket 是一种在单个Tcp连接上进行双全工通信的协议.websocket通信协议于2011年被IETF定为标准RFC6455,并 由RFc7936补充规范.WebSoc ...
- oracle 使用显式的游标(CURSORs)
使用隐式的游标,将会执行两次操作. 第一次检索记录, 第二次检查TOO MANY ROWS 这个exception . 而显式游标不执行第二次操作.
- settTimeout vs setInterval
setTimeout:过一段固定的时间后,将代码提交到代码队列中排队. setInterval:每隔一段固定的时间,执行一次代码. 他们两都接受两个参数,第一个参数是字符串或者函数,第二个参数是设定的 ...
- 装机必备 Windows 操作系统ISO镜像资源
小编今天使用VMware虚拟机软件搭建Win7系统时,开始一直不成功总是出现:Start booting from CD...Directory "EZBOOT" not foun ...
- C# 递归、try
一.递归 递归:在函数体内调用本函数自身,直到符合某一条件不再继续调用 两个需要满足的条件1.有反复调用自身函数的过程2.有函数的出口:有不再继续执行的条件 例子: 案例: (一).输入正整数n,求n ...
- poj 1920 Towers of Hanoi
Towers of Hanoi Time Limit: 3000MS Memory Limit: 16000K Total Submissions: 2213 Accepted: 986 Ca ...
- 2019-6-23-win10-uwp-解决-SerialDevice.FromIdAsync-返回空
title author date CreateTime categories win10 uwp 解决 SerialDevice.FromIdAsync 返回空 lindexi 2019-6-23 ...
- Spring Boot笔记之邮件(spring-boot-starter-mail)
Spring Boot环境中发送邮件 pom.xml引入`spring-boot-starter-mail` application.yml配置 163邮箱 QQ邮箱 Gmail邮箱 发送邮件 ser ...