2018普及组摆渡车洛谷5017(dp做法)
啦啦啦,这一篇是接上一篇的博客,上一篇是记忆化搜索,而这一篇是dp+前缀和小技巧
dp这种玄学做法我这种蒟蒻当然不是自己想出来的,参考https://blog.csdn.net/kkkksc03/article/details/84798228
首先定义f[i],表示在时间i已积累的最小等待时间,因为时间范围是<=4*10^6,所以不会炸。定义cnt[i]表示到i时刻时已经到达的人数(包括被车送走的),sum[i]表示到i时刻时到达车站的同学的时间的总和,然后就可推出转移方程:f[i]=min(f[i],f[j]+(cnt[i]-cnt[j])*i-(sum[i]-sum[j])。f[j]指的是上一次发车的时间。咳,那么这个方程是怎么推出来呢?
cnt[i]-cnt[j]指的是从i到j中新加入的新童鞋,在j到i这段时间中新加入的会积累等待时间,假设加入了s1,s2,s3(时间)三位童鞋,积累的等待时间即为i-s1+i-s2+i-s3,等于i*(cnt[i]-cnt[j])-(sum[i]-sum[j])
代码中的一点也是相同的思想:f[i]=cnt[i]*i-sum[i]
剩下就是代码啦,里面也有详细注释
#include<bits/stdc++.h>
using namespace std;
int a[],cnt[],sum[],f[];
//f[i]指i时刻已经积累的所有人的等待时间和
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int Time=;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
cnt[a[i]]++;//在a[i]时间到达的人
sum[a[i]]+=a[i];//sum是前缀和数组
Time=max(Time,a[i]);//求出到达时间中的最大,加上m作为dp的上限
}
for(int i=;i<Time+m;i++)
{
cnt[i]+=cnt[i-];//cnt[i]指的是到i时刻时,已经到达了的人数(包括送走的)
sum[i]+=sum[i-];//sum[i]代表第i时间到达车站的同学的时间的总和
}
for(int i=;i<Time+m;i++)//dp时间
//Time+m:最后一个人最晚送的时间小于Time+m(也就是上一班车刚好在最后一个人前发车,刚好把最后一个人落下)
{
if (i>=m&&cnt[i-m]==cnt[i])//到下一次发车时中途没有人来
{
f[i]=f[i-m];//等待时间不变化,直接跳过即可
continue;
}
f[i]=cnt[i]*i-sum[i];//初始化,这样还没开第一班车
int tmp;
tmp=max(i-*m+,);//车的等待时间不会超过m,超过m还不如多开一次
for(int j=tmp;j<=i-m;j++)
f[i]=min(f[i],f[j]+(cnt[i]-cnt[j])*i-(sum[i]-sum[j]));//转移方程
}
int ans=;
for(int i=Time;i<Time+m;i++)//注意范围
ans=min(ans,f[i]);
printf("%d",ans);
return ;
}
呼!终于把这道题弄完了(rp++)
2018普及组摆渡车洛谷5017(dp做法)的更多相关文章
- 2017普及组D1T3 洛谷P3956 棋盘
2017普及组D1T3 洛谷P3956 棋盘 原题 题目描述 有一个m×m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在 ...
- NOIP2011 普及组 T3 洛谷P1309 瑞士轮
今天题做太少,放道小题凑数233 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公 ...
- 二叉树的遍历 &【NOIP2001普及组】& 洛谷 P1030 求先序排列
题目链接 https://www.luogu.org/problemnew/show/P1030 模板题 先讲一下二叉树的遍历 二叉树的遍历 分类 性质 求法 分为三类: 先序遍历(PreOrder) ...
- 洛谷 1063 dp 区间dp
洛谷 1063 dp 区间dp 感觉做完这道提高组T1的题之后,受到了深深的碾压,,最近各种不在状态.. 初看这道题,不难发现它具有区间可并性,即(i, j)的最大值可以由(i, k) 与 (k+1, ...
- NOIP 2018 普及组 解题报告
目录 标题统计 题目链接 思路 代码 龙虎斗 题目链接: 思路 代码 摆渡车 题目链接: 思路 对称二叉树 题目链接 思路: 先来解释一下为毛现在才来发解题报告: 其实博主是参加过NOIP 2018普 ...
- P5017 [NOIP2018 普及组] 摆渡车
P5017 [NOIP2018 普及组] 摆渡车 题目 P5017 思路 将实际问题抽象后,不难发现这是一个 区间 \(DP\) 我们不妨认为时间是一条数轴,每名同学按照到达时刻分别对应数轴上可能重合 ...
- 洛谷 1373 dp 小a和uim之大逃离 良心题解
洛谷 1373 dp 这题还不算太难,,当初看的时候不是很理解题意,以为他们会选择两条不同的路径,导致整体思路混乱 传送门 其实理解题意和思路之后还是敲了不短的时间,一部分身体原因再加上中午休息不太好 ...
- 洛谷 1052 dp 状态压缩
洛谷1052 dp 状态压缩 传送门 (https://www.luogu.org/problem/show?pid=1052#sub) 做完这道题之后,感觉涨了好多见识,以前做的好多状压题目都是将一 ...
- 洛谷 1156 dp
洛谷1156 dp 类背包问题 老久没有自己想出来过dp方程了,,,虽然到最后还是只写了30分,,, 设dp[j]表示最大生命值为i时的最大高度,则对于每个物品,可以选择吃掉或者放上去,即转移为dp[ ...
随机推荐
- AutoBat
var currentDir = Directory.GetCurrentDirectory(); var filePath = string.Format("{0}\\Auto.bat&q ...
- 【二次开发】shopxo商城
https://shopxo.net/ [问题1:配置邮箱注册]https://ask.shopxo.net/article/19
- Java命令行参数解析
参考 http://blog.csdn.net/mldxs/article/details/36204079 http://rensanning.iteye.com/blog/2161201 imp ...
- Deeplab v3+中的骨干模型resnet(加入atrous)的源码解析,以及普通resnet整个结构的构建过程
加入带洞卷积的resnet结构的构建,以及普通resnet如何通过模块的组合来堆砌深层卷积网络. 第一段代码为deeplab v3+(pytorch版本)中的基本模型改进版resnet的构建过程, 第 ...
- 使用msf对tomcat测试
1.1 使用nmap命令对目标主机进行扫描.单击桌面空白处,右键菜单选择"在终端中打开". 1.2 在终端中输入命令"nmap –sV 192.168.1.3" ...
- python 爬虫-2
小白新手完全不懂的什么,还有一个robots.txt限制文件,稀里糊涂的 还是百度 可以看一下:http://www.baidu.com/robots.txt 里面会有一些限制,常见的一些配 ...
- word之选中文本
在word和notepad中: 特别是在文件很大,如果用鼠标下滑的话,不知道会滑多久呢, 快捷键+鼠标点击截至处
- h5 input 的验证
<input type="text" id="a" required/> <input type="text" id=&q ...
- Flask最强攻略 - 跟DragonFire学Flask - 第十四篇 Flask-SQLAlchemy
前不久刚刚认识过了SQLAlchemy,点击这里复习一下 当 Flask 与 SQLAlchemy 发生火花会怎么样呢? Flask-SQLAlchemy就这么诞生了 首先要先安装一下Flask-SQ ...
- 防火墙iptables 设置
在服务器上架了一个tomcat,指定好端口号,我就开始访问,未果! 公司对服务器(RedHat)端口限制,可谓是滴水不漏! 用iptables 查看防火墙设置: Shell代码 iptables -n ...