博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOIP2011 观光公交
阅读量:7056 次
发布时间:2019-06-28

本文共 2325 字,大约阅读时间需要 7 分钟。

话说,我终于AC了这个题

这是一个贪心,说实话开始做的时候......完全没看出来QAQ。。

可能有人说这是个dp,但这真不是(dalao请无视)

这真的只是个贪心。。。。

首先对于每个点当然是能走就走,

不能走就等待,这是无法控制的。
所以只考虑氮气加速器加在哪里可以使时间总和尽量少。

所以

如果选择加速,可能会使后面等待的时间更长,或者更短,对后面都会有影响。

但是沿着一条边加速会影响后面的所有边么?

这可不一定

来来来,我们分类讨论一下:

1.到下一个点还需要等待:以后的时间就不再影响了

2.到下一个点不需要等待:对以后的时间还会加速直到……出现情况1(或者到最后一个点)!!

即每次用加速器都会对后面的人有影响,

用 $ sum_i $ 记录到i的人数,前缀和处理, $ g_i $ 代表每个点所能影响到的最远点,

那么 $ sum_{i + g_i} - sum_i $ 即是能影响到的人数

这样就很容易想到选择影响尽量大的点减掉(在这里贪心)。

CODE:

/*last[i] : 最后一个人到达i站点的时间。sum[i] : 到i站点的总人数。enter[i] : 公交车到i站点的最少时间。g[i] : 每个站点所能影响到的最远站点,即要求的影响。*/#include
#include
#include
#include
#define N 30001using namespace std;int n,m,k;int dis[N],last[N],g[N],enter[N];int ans,sum[N],maxx = -1;struct node { int time,start,end;}a[N];inline void bus(int x) { while(x) { --x; g[n] = g[n - 1] = n; int tar; maxx = -1; for(int i = n - 2 ; i >= 1 ; -- i) { if(enter[i + 1] <= last[i + 1])//下一个点如果等待 g[i] = i + 1;//最多影响到下一个 else //不等待 g[i] = g[i + 1];//继续减少后面的时间 } for(int i = 1 ; i < n ; ++ i){//for边数 int tmp = sum[g[i]] - sum[i];//最多影响的人数 if(tmp > maxx && dis[i] > 0){ maxx = tmp; tar = i;//标记最优情况减的点 } } ans -= maxx;//更新ans dis[tar] --;//减掉dis for(int i = 2 ; i <= n ; ++ i) enter[i] = max(enter[i - 1],last[i - 1]) + dis[i - 1];//重新更新enter } return;}int main(){ scanf("%d%d%d",&n,&m,&k); for(int i = 1 ; i < n ; ++ i) scanf("%d",&dis[i]); for(int i = 1 ; i <= m ; ++ i) scanf("%d%d%d",&a[i].time,&a[i].start,&a[i].end); for(int i = 1 ; i <= m ; ++ i) { last[a[i].start] = max(last[a[i].start],a[i].time);//最后一个人到a[i].start站点的时间 和到这个点的时间取max sum[a[i].end] ++; } enter[1] = last[1]; for(int i = 1 ; i <= n ; ++ i) sum[i] += sum[i - 1];//到i站点的总人数 前缀和处理 for(int i = 2 ; i <= n ; ++ i) enter[i] = max(enter[i - 1],last[i - 1]) + dis[i - 1];//公车到i站点的最少时间 和最后到的时间取max for(int i = 1 ; i <= m ; ++ i) ans += enter[a[i].end] - a[i].time;//处理出不加加速器的answer,后面就可以直接减啦~ bus(k); printf("%d \n",ans); return 0;}

真的是考验智商QAQ...

转载于:https://www.cnblogs.com/Repulser/p/10665627.html

你可能感兴趣的文章
android如何在代码中设置margin
查看>>
spring 定义自己的标签 学习
查看>>
hdu2899 Strange fuction
查看>>
【C/C++】快速排序的两种实现思路
查看>>
T-SQL:毕业生出门需知系列(五)
查看>>
教程-Delphi操作快捷键
查看>>
网站服务架构(转)
查看>>
JDBC加载过程
查看>>
【转】如何过滤 adb logcat 输出
查看>>
9260与SAM-BA连接(转)
查看>>
ffmpeg+ffserver搭建流媒体服务器
查看>>
深入理解JVM内幕[转]
查看>>
pytimechart使用
查看>>
蓝桥杯——分而治之的子集数
查看>>
hdu 5430 Reflect (数学推导题)
查看>>
Cortex-M4 Core Registers
查看>>
Android SDK Manager 更新代理配置
查看>>
Scala 深入浅出实战经典 第79讲:单例深入讲解及单例背后的链式表达式
查看>>
Reveal UI 分析工具分析手机 App
查看>>
扩展Bootstrap Tooltip插件使其可交互
查看>>