P4870 [BalticOI 2009 Day1]甲虫 题解
简要题意
在一个数轴上有 \(n\) 滴露水,每滴露水初始水量为 \(m\),每秒会蒸发一滴水,一个甲虫初始在原点,速度为 1,水能瞬间喝完,问它最多能喝到几滴水。
题目分析
对于这种移动区间连续的题目,我们首先考虑区间 dp,记 \(f_{l,r,0}\) 表示喝完区间 \([l,r]\) 的水且在左边表示的最小时间,第三维为 1 的时候在右边,据此设计转移。
但是我们发现本题中多了一维时间,强行增加维度时间复杂度会爆,我们考虑控制变量。
可以发现,上述转移最大的问题在于我们不知道转移之后每个水滴的剩余水量,而剩余水量和最多的水都可以通过已蒸发的水量和总共经过的水滴数求出,转换后复杂度降低,符合我们的要求。
于是我们把储存对象改为已蒸发水量,外层枚举一个总共经过的水滴数,定义喝完当前的水后还差 \(k\) 滴水没喝,\(val\) 为排序后的水滴横坐标,可以得到状态转移方程:
\(f_{l,r,0}=\min(f_{l+1,r,1}+k \times |val_r-val_l|,f_{l+1,r,0}+k \times |val_{l+1}-val_l|)\)
\(f_{l,r,1}=\min(f_{l,r-1,1}+k \times |val_r-val_{r-1}|,f_{l,r-1,0}+k \times |val_{l}-val_{r}|)\)
实现时还需要注意特判只喝一个水滴时的边界情况。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
ll n,m;
ll val[1000001];
ll dp[301][301][2];
ll calc(int lim){
ll ans=0x3f3f3f3f3f3f3f3f;
for(int len=1;len<=lim;len++){
for(int l=1;l+len-1<=n;l++){
int r=l+len-1;
if(len==1)dp[l][r][0]=dp[l][r][1]=lim*abs(val[l]);
else{
dp[l][r][0]=dp[l][r][1]=0x3f3f3f3f3f3f3f3f;
dp[l][r][0]=min(dp[l][r][0],dp[l+1][r][0]+(lim-len+1)*abs(val[l+1]-val[l]));
dp[l][r][0]=min(dp[l][r][0],dp[l+1][r][1]+(lim-len+1)*abs(val[r]-val[l]));
dp[l][r][1]=min(dp[l][r][1],dp[l][r-1][1]+(lim-len+1)*abs(val[r]-val[r-1]));
dp[l][r][1]=min(dp[l][r][1],dp[l][r-1][0]+(lim-len+1)*abs(val[l]-val[r]));
}
if(len==lim) ans=min(ans,min(dp[l][r][0],dp[l][r][1]));
}
}
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>val[i];
sort(val+1,val+n+1);
ll ans=0;
for(int i=1;i<=n;i++)ans=max(ans,i*m-calc(i));
cout<<ans<<endl;
}
P4870 [BalticOI 2009 Day1]甲虫 题解的更多相关文章
- P6739 [BalticOI 2014 Day1] Three Friends 题解
目录 写在前面 Solution 何为字符串哈希(可跳过): Code 写在前面 P6739 [BalticOI 2014 Day1] Three Friends 听说这题可以用比较暴力的做法过,比如 ...
- LOJ#2632. 「BalticOI 2011 Day1」打开灯泡 Switch the Lamp On
题目描述 译自 BalticOI 2011 Day1 T3「Switch the Lamp On」有一种正方形的电路元件,在它的两组相对顶点中,有一组会用导线连接起来,另一组则不会.有 N×M 个这样 ...
- A · F · O —— JLOI2018翻车记(附Day1简要题解)
JLOI2018翻车记 并不知道该怎么写... 算了还是按照标准剧情来吧 这应该是一篇写得非常差的流水账... 2018.04.04 Day -1 省选前在机房的最后一天. 压力并不是很大,毕竟联赛 ...
- 「CSP-S」2019年第一届Day1游记+题解
「CSP-S」2019年第一届Day1游记+题解 Day 1 7:30 A.M. 8:10 A.M. 8:30 A.M. T1 格雷码 题目 考场经历+思考(正解) 8:50 A.M. T2 括号树 ...
- luoguP6754 [BalticOI 2013 Day1] Palindrome-Free Numbers
目录 luoguP6754 [BalticOI 2013 Day1] Palindrome-Free Numbers 简述题意: Solution: Code luoguP6754 [BalticOI ...
- P6753 [BalticOI 2013 Day1] Ball Machine
P6753 [BalticOI 2013 Day1] Ball Machine 题意 给你一个树,每次从根节点放一个求,如果其子节点有空这个球会向下滚,若有多个节点为空则找儿子中以子树内编号的最小值为 ...
- JLOI2015 DAY1 简要题解
「JLOI2015」有意义的字符串 题意 给你 \(b, d, n\) 求 \[ [(\frac{b + \sqrt d}2)^n] \mod 7528443412579576937 \] \(0 & ...
- SCOI2016 Day1 简要题解
目录 「SCOI2016」背单词 题意 题解 代码 「SCOI2016」幸运数字 题意 题解 总结 代码 「SCOI2016」萌萌哒 题意 题解 总结 代码 「SCOI2016」背单词 题意 这出题人 ...
- SCOI 2015 Day1 简要题解
「SCOI2015」小凸玩矩阵 题意 一个 \(N \times M\)( $ N \leq M $ )的矩阵 $ A $,要求小凸从其中选出 $ N $ 个数,其中任意两个数字不能在同一行或同一列, ...
- [NOIP 2018 Day1] 简要题解
[题目链接] 铺设道路 : https://www.luogu.org/problemnew/show/P5019 货币系统 : https://www.luogu.org/problemnew/sh ...
随机推荐
- 2023ccpc大学生程序设计竞赛-wmh
这算是我第一次参加这种团队赛,感谢程老师给我这个机会.刚开赛还算比较顺利,一眼看出来A是个签到,拿下之后开始跟榜F题.一开始想法比较简单,就是排序,记录相邻两个数的差,然后再排序.wa了后以为是范围出 ...
- Lazy(Func<T>)的异常缓存问题
Lazy可以提供多线程环境下的安全保障,但是用不好也是会跳到坑里. 我这里使用Lazy<t>(Func<T>)来创建一个Lazy实例,然后在需要的地方访问它的Value属性,它 ...
- 一对多数据的多选筛选([EF,ABP]但是sql思路通用)
一对多数据的多选筛选([EF,ABP]但是sql思路通用) 标题起的并不是特别准确,但是现在又没有更加准确的描述,暂时这样了 业务需求: 数据格式为一条数据,对应多条二级数据,暂时表示为主信息为&qu ...
- Django: ERRORS: ?: (staticfiles.E001) The STATICFILES_DIRS setting is not a tuple or list. HINT: Perhaps you forgot a trailing comma?
必须是数组或者列表类型 如下所示: # 错误# STATICFILES_DIRS = { # os.path.join(BASE_DIR, 'static'), # }# 正确 STATICFILES ...
- appium环境搭建python
python appium环境搭建 appium是什么? 1,appium是开源的移动端自动化测试框架:2,appium可以测试原生的.混合的.以及移动端的web项目:3,appium可以测试io ...
- 通过 tree shaking 移除无用代码
tree shaking 依赖于ES Module 的静态语法分析,在项目编译时移除无用的代码以减少文件体积. usedExports 在文件中,我们可能定义了变量但是暂时又没有用到,这样会造成空间的 ...
- JS中文件相关的知识(一):MIME类型
不知道有没有同学和我一样,写代码时一遇到文件操作就犯怵,必须要先去把知识补一遍再说:对于Content-Type.responseType.ArrayBuffer.buffer.blob.file等这 ...
- C#开发的基础工具类集合 - 开源研究系列文章
今天发布一个基础工具类代码集合. 以前有发布过一个类似的类库(见博文: Magical平台类库代码分享 ),不过那个版本有点久了,也没有这次这个全面,这次发布的是一个很多地方用到的基础类库代码. 1. ...
- 小知识:vi 查找如何不区分大小写
在使用vi查找数据库的truncate记录日志时,发现对应语句夹杂了大小写,不够规范: 而vi默认查找是区分大小写的,如何不区分大小写查找指定内容呢? 有两种方式: (1)在查找指令后面额外加上\c标 ...
- WPF动画入门教程
Windows Presentation Foundation (WPF)是一种用于创建Windows客户端应用程序的UI框架.它让我们能够创建丰富的图形界面,包括各种各样的动画效果.接下来,我们将介 ...