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[ ...
随机推荐
- Elasticsearch学习笔记(三)聚合分析Agg
一.设置fielddata PUT /index/_mapping/type { "properties":{ "fieldName" ...
- soapui调用redis,获取短信验证码
1.首先,调用redis需要引入redis的jar包,放入到soapui指定目录中,例如我的目录D:\Program Files\SmartBear\SoapUI-Pro-5.1.2\bin\ext ...
- qemu对虚拟机的内存管理(二)
上篇文章主要分析了qemu中对虚拟机内存管理的关键数据结构及他们之间的联系,这篇文章则主要分析在地址空间发生变化时,如何将其更新至KVM中,保持用户空间与内核空间的同步. 这一系列操作与之前说的Add ...
- vue 点击弹窗外框关闭弹框
https://blog.csdn.net/zjw0742/article/details/77822777 ready() { document.addEventListener('click', ...
- springmvc用model传值到jsp页面,el表达式引用接收不到传递过来的值
springmvc用model传值到jsp页面,el表达式引用接收不到传递过来的值 查看下controller层代码可以发现,写的是没有错误的. @RequestMapping("list. ...
- Python openpyxl、pandas操作Excel方法简介与具体实例
本篇重点讲解windows系统下 Python3.5中第三方excel操作库-openpyxl: 其实Python第三方库有很多可以操作Excel,如:xlrd,xlwt,xlwings甚至注明的数据 ...
- ACFS-9459: ADVM/ACFS is not supported on this OS version
环境:RHEL 7.3 + Oracle 12.2.0.1 RAC 现象:acfs资源状态不正常,asmca图形也没有acfs相关内容,无法使用acfs. 1.具体现象 2.定位bug 3.解决问题 ...
- C#设计模式(6)——原型模式(Prototype Pattern)(转)
一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...
- 第三篇——Struts2的动态方法调用
Struts2动态方法调用 默认方式:默认执行方法中的execute方法,若指定类中没有该方法,默认返回success: method方式:执行method属性中定义的方法,没有该方法,页面报错: 通 ...
- 【2017-05-18】WebForm的Repeater控件及简单控件
<%@ %> - 这里面写一些声明和引用的 <% %> - 编写C#代码的 <%= %> - 往界面上输出一个变量的值 <%# Eval("属性名 ...