【洛谷 P5017】 摆渡车(斜率优化)
题目链接
算是巩固了一下斜率优化吧。
设\(f[i]\)表示前\(i\)分钟最少等待时间。
则有\(f[i]=\min_{j=0}^{i-m}f[j]+(cnt[i]-cnt[j])*i-(sum[i]-sum[j])\)
其中\(cnt[i]\)和\(sum[i]\)分别表示前\(i\)分钟去等车的学生数量和他们去等车的时刻之和。
变形一下得\(f[j]+sum[j]=i*cnt[j]+i*cnt[i]-sum[i]-f[i]\)
维护一个下凸包即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 510;
const int MAXT = 4000010;
int n, m, t[MAXN], cnt[MAXT], sum[MAXT], f[MAXT], ans = 2147483647, q[MAXT], head, tail;
inline double k(int i, int j){
return (double)(f[j] + sum[j] - f[i] - sum[i]) / (cnt[i] == cnt[j] ? 1e-9 : cnt[j] - cnt[i]);
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i){
scanf("%d", &t[i]);
cnt[t[i]]++;
sum[t[i]] += t[i];
}
sort(t + 1, t + n + 1);
for(int i = 0; i < t[n] + m; ++i)
cnt[i] += cnt[i - 1], sum[i] += sum[i - 1];
for(int i = 0; i < m; ++i)
f[i] = cnt[i] * i - sum[i];
for(int i = m; i < t[n] + m; ++i){
while(head < tail && k(q[tail - 1], q[tail]) >= k(q[tail], i - m)) --tail;
q[++tail] = i - m;
while(head < tail && k(q[head], q[head + 1]) <= i) ++head;
int j = q[head];
f[i] = f[j] + (cnt[i] - cnt[j]) * i - (sum[i] - sum[j]);
if(i >= t[n]) ans = min(ans, f[i]);
}
printf("%d\n", ans);
return 0;
}
【洛谷 P5017】 摆渡车(斜率优化)的更多相关文章
- NOIp2018普及组T3暨洛谷P5017 摆渡车:题解
题目链接:https://www.luogu.org/problemnew/show/P5017 emm,这次的真的不简单的,T3比T4难? 醉了... 蒟蒻肯定没有其他大佬讲的好啊,但肯定尽力,真的 ...
- 洛谷P5017摆渡车
题目 一道做法多种多样的题,DP做法的状态也很多. 我用\(dp[i]\)表示在第i秒发车的时间和,然后dp方程就很好写了 \(dp[i] = dp[j] + i车的等待时间\)j属于i-2m ~ i ...
- 洛谷 P5017 摆渡车
题目传送门 解题思路: 个人感觉DP这东西,只可意会,不可言传 AC代码: #include<iostream> #include<cstdio> #include<cs ...
- Lightning Conductor 洛谷P3515 决策单调性优化DP
遇见的第一道决策单调性优化DP,虽然看了题解,但是新技能√,很开森. 先%FlashHu大佬,反正我是看了他的题解和精美的配图才明白的,%%%巨佬. 废话不多说,看题: 题目大意 已知一个长度为n的序 ...
- Guard Duty (medium) Codeforces - 958E2 || (bzoj 2151||洛谷P1792) 种树 || 编译优化
https://codeforces.com/contest/958/problem/E2 首先求出N个时刻的N-1个间隔长度,问题就相当于在这些间隔中选K个数,相邻两个不能同时选,要求和最小 方法1 ...
- 『摆渡车 斜率优化dp及总结』
摆渡车的题解我已经写过一遍了,在这里,这次主要从斜率优化的角度讲一下摆渡车,并总结一下斜率优化会出现的一些奇奇怪怪的错误. 摆渡车 Description 有 n 名同学要乘坐摆渡车从人大附中前往人民 ...
- 洛谷P5017:摆渡车——题解
https://www.luogu.org/problem/P5017 参考:https://www.luogu.org/blog/ztyluogucpp/solution-p5017 我想我大概是废 ...
- 斜率优化DP学习笔记
先摆上学习的文章: orzzz:斜率优化dp学习 Accept:斜率优化DP 感谢dalao们的讲解,还是十分清晰的 斜率优化$DP$的本质是,通过转移的一些性质,避免枚举地得到最优转移 经典题:HD ...
- 洛谷P1710 地铁涨价
P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...
随机推荐
- hdoj - 1864 最大报销额
Problem Description 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品 ...
- 【大数据】安装关系型数据库MySQL 安装大数据处理框架Hadoop
作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3161 1.安装Mysql 使用命令 sudo apt-get ins ...
- .Net Core EF 使用整理合集
1..NetCore中EFCore的使用整理 2..NetCore中EFCore的使用整理(二)-关联表查询 3.EF Core 1.0 和 SQLServer 2008 分页的问题 4.EF Cor ...
- Linux下打开超大文件的方法
Linux下打开超大文件方法 在Linux下用VIM打开大小几个G.甚至几十个G的文件时,是非常慢的. 这时,我们可以利用下面的方法分割文件,然后再打开. 1 查看文件的前多少行 head -1000 ...
- 善用mysql中的FROM_UNIXTIME()函数和UNIX_TIMESTAMP()函数
我们经常会面临要从数据库里判断时间,取出特定日期的查询.但是数据库里储存的都是unix时间戳,处理起来并不是特别友好.幸而MYSQL提供了几个处理时间戳的函数,可以帮助我们在查询的时候,就将时间戳格式 ...
- String.format()详细用法
String.format()字符串常规类型格式化的两种重载方式 format(String format, Object… args) 新字符串使用本地语言环境,制定字符串格式和参数生成格式化的新字 ...
- 转 Shell判断字符串包含关系的几种方法
https://blog.csdn.net/rznice/article/details/71086839 Shell中判断字符串包含关系的方法: 1.通过grep来判断:12str1="a ...
- [LeetCode] 305. Number of Islands II 岛屿的数量 II
A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ...
- 日志收集系统ELK搭建
一.ELK简介 在传统项目中,如果在生产环境中,有多台不同的服务器集群,如果生产环境需要通过日志定位项目的Bug的话,需要在每台节点上使用传统的命令方式查询,这样效率非常低下.因此我们需要集中化的管理 ...
- polynomial&generating function学习笔记
生成函数 多项式 形如$\sum_{i=0}^{n}a_i x^i$的代数式称为n阶多项式 核函数 {ai}的核函数为f(x),它的生成函数为sigma(ai*f(i)*x^i) 生成函数的加减 {a ...