【bzoj1010】玩具装箱toy——斜率优化dp
题目链接
第一道自己推的斜率优化dp><
首先要明确一点:装进同一个容器的toys一定要是连着的几个(否则的话可以直接贪心)-->之前理解错题意WA了一次......
用sum[i]表示前缀和,f[i]表示前i个装进容器的最小费用,
容易知道
f[i]=max(f[i],f[j]+(sum[i]-sum[j]+i-(j+1)-l)2)(j<i)
令k<j<i,若要使f[j]>f[k],则需要满足:
f[j]+(sum[i]-sum[j]+i-(j+1)-l)2<f[k]+(sum[i]-sum[k]+i-(k+1)-l)2
令t[i]=sum[i]+i,则移项,可得:
f[j]-f[k]+(t[j]-t[k])*(t[j]+t[k])<2(t[i]-l-1)(t[j]-t[k])
即:
(f[j]-f[k]+t[j]2-t[k]2)/(t[j]-t[k])<2*(t[i]-l-1)
令g[i]=f[i]+t[i]2,则有
(g[j]-g[k])/(t[j]-t[k])<2*(t[i]-l-1)。
用s(i,j)表示i到j连线的斜率,
对于一个单调队列,每次对于队首,若s(q[h],q[h+1])<2*(ti-l-1),则此时的q[h]一定不会是现在和以后的最优解,h++;
对于队尾,若s(q[t-2],q[t-1])>s(q[t-1],i),如果s(q[t-2],q[t-1])<2*(t[i]-l-1),则s(q[t-1],i)<2*(t[i]-l-1),由i>q[t-1]可知此时i比q[t-1]要优;如果s(q[t-2],q[t-1])>2*(t[i]-l-1),则q[t-2]要比q[t-1]优。所以无论如何q[t-1]都不会是最优解,此时t--。
接着就是斜率优化dp的套路了:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 typedef long long LL; 5 const int maxn=5e4+5; 6 using namespace std; 7 LL a[maxn],q[maxn],sum[maxn],g[maxn],t[maxn],f[maxn]; 8 inline LL read() 9 { 10 LL anss=0,f=1;char c=getchar(); 11 while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} 12 while(c>='0'&&c<='9'){anss=anss*10+c-48;c=getchar();} 13 return anss*f; 14 } 15 inline double cal(LL a,LL b) 16 { 17 return 1.0*(g[a]-g[b])/(t[a]-t[b]); 18 } 19 int main() 20 { 21 int n,l; 22 sum[0]=0; 23 scanf("%d %d",&n,&l); 24 for(int i=1;i<=n;i++){ 25 a[i]=read(); 26 sum[i]=sum[i-1]+a[i]; 27 t[i]=sum[i]+i; 28 } 29 int h=0,ta=1;q[0]=0; 30 for(int i=1;i<=n;i++) 31 { 32 while(h<ta-1&&cal(q[h],q[h+1])<2*(t[i]-l-1))h++; 33 f[i]=f[q[h]]+(t[i]-t[q[h]]-l-1)*(t[i]-t[q[h]]-l-1); 34 g[i]=f[i]+t[i]*t[i]; 35 while(h<ta-1&&cal(q[ta-1],q[ta-2])>cal(q[ta-1],i))ta--; 36 q[ta++]=i; 37 } 38 printf("%lld",f[n]); 39 return 0; 40 }
bzoj1010
转载于:https://www.cnblogs.com/JKAI/p/7460495.html
【bzoj1010】玩具装箱toy——斜率优化dp相关推荐
- bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MB Submit: 11893 Solved: 5061 [Submit] ...
- 『玩具装箱TOY 斜率优化DP』
玩具装箱TOY(HNOI2008) Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊 ...
- BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化dp
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...
- BZOJ1010:[HNOI2008]玩具装箱TOY(斜率优化DP)
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压 缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1.. ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP
题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...
- 【BZOJ1010】【codevs1319】玩具装箱,斜率优化DP
传送门1 传送门2 写在前面:好像double要比long long快? 思路:想拿来练手的斜率优化DP,却忘记了一些基本原则,好坑 基本的DP转移 f[i]=min(f[j]+(sum[i]−sum ...
- YBTOJ洛谷P3195:玩具装箱(斜率优化dp)
传送门 文章目录 前言 解析 代码 前言 斜率优化dp,就是利用斜率优化的dp (逃) 解析 第一道斜优的题 分析题目 设sumisum_isumi为1-i的c的前缀和 容易写出dp转移式: dpi ...
- [Bzoj1010][HNOI2008]玩具装箱toy(斜率优化)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1010 首先预处理前缀和sum[i],然后推出初始的dp方程,dp[i]表示装前i件物品的 ...
- P3195-[HNOI2008]玩具装箱【斜率优化dp】
正题 题目链接:https://www.luogu.com.cn/problem/P3195 题目大意 nnn个物品,分成若干段,每一段的长度为j−i+∑i=lrCkj-i+\sum_{i=l}^rC ...
最新文章
- 公司电脑用域账号访问团队文件夹
- python windows窗口置顶_想用Python编程却不知如何下手?一篇搞定编程准备工作
- 端上智能——深度学习模型压缩与加速
- 序列二次规划_最优控制与规划
- 使用Varnish代替Squid做网站缓存加速器的详细解决方案
- Linux 6.4 partprobe出现warning问题
- 接口implements
- Bugku-Web-xxx二手交易市场
- python 新建文件 hdfs_python使用hdfs3模块对hdfs进行操作详解
- Unity3D学习笔记(三十七):顶点偏移和溶解
- java后台对接app微信支付
- laravel-excel 中设置列宽,单元格内容垂直和水平都居中
- CMCT-FA修饰阿霉素纳米脂质体/ADR-HAS-MS单抗Hab18偶联阿霉素人血清白蛋白微球的制备方法
- 饥荒 阿里云服务器搭建记录
- 总线揭密 串行传输VS并行传输
- linux 内核调试 booting the kernel.,booting the kernel后无内核启动信息的调试方法
- 小米电视1代上半屏背光闪的问题解决
- 辰视携3D机器视觉技术亮相第九届中国电子信息博览会
- Milvus 2.0 Knowhere 概览
- 计算机基础教学改革申报书,混合教学试点课程改革项目申报书-《计算机文化基础》...