题意:\(1\sim N\) 号工厂,第\(i\) 个工厂有\(P_i\)个成品,第\(i\)个工厂建立仓库需要\(C_i\)的费用,该工厂距离第一个工厂的距离为\(X_i\),编号小的工厂只能往编号大的工厂搬用成品,每单位成品搬每单位距离需要花费1,问所有成品搬到工厂里面所需的最少费用是多少

分析

设\(f[i]\) 为第 i 个工厂建立仓库,前 i 个工厂的成品都搬到仓库中的最小花费,则容易得到动态转移方程:

\[f[i] = min(f[j] + P_{j+1}(X_i-X_{j+1}) + P_{j+2}(X_i-X_{j+2})+\cdots + P_{i-1}(X_i-X_{i-1}))+C_i
\]

通式为

\[f[i]=min(f[j]+\sum_{k=j+1}^{i-1}P_k\cdot X_i-\sum_{k=j+1}^{i-1}P_k\cdot X_k)+C_i
\]

令 \(s[i] = \sum_1^i P[i], ~~g[i] = \sum_1^iP_i\cdot X_i\),

则方程变为

\[f[i] = min(f[j] + X_i\cdot (s[i-1]-s[j])-(g[i-1]-g[j]))+C_i
\]

则对于最优决策 \(j\) ,有

\[f[j]+g[j]=X_i\cdot s[j]+f[i]-X_i\cdot s[i-1]-C_i
\]

也就是要找 \(y = kx+b\),\(k\)已知,找一对\(x,y\)使得截距最小

由于\(X[i]\)是随\(i\)递增的,所以要维护的决策集的斜率也是递增的

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
typedef long long ll;
ll C[N],P[N],X[N],f[N],s[N],g[N];
int n;
int q[N],l,r;
long double slope(int i,int j){
return (long double)((f[i]+g[i]) - (f[j]+g[j]))/(s[i]-s[j]);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld%lld%lld",&X[i],&P[i],&C[i]);
s[i] = s[i-1] + P[i];
g[i] = g[i-1] + P[i] * X[i];
}
l = r = 0;
for(int i=1;i<=n;i++){
while(l < r && slope(q[l],q[l+1]) <= X[i])l++;
int j = q[l];
f[i] = f[j] + (s[i-1] - s[j]) * X[i] - g[i-1] + g[j] + C[i];
while(l < r && slope(q[r-1],q[r]) > slope(q[r-1],i))r--;
q[++r] = i;
}
printf("%lld\n",f[n]);
return 0;
}

最新文章

  1. Effective java笔记(四),泛型
  2. VirtualBox + vagrant
  3. 浅谈A/B测试里常见的辛普森悖论,企业决策者必看
  4. Linux 远程登录
  5. 微软BI 之SSIS 系列 - 在 SSIS 中导入 ACCESS 数据库中的数据
  6. apache开源项目--Syncope
  7. 滑屏 H5 开发实践九问
  8. UIWebView的使用,简单浏览器的实现
  9. SlidingMenu+ViewPager实现侧滑菜单效果
  10. Axiom3D学习日记 1.程序配置
  11. loj1341(数学)
  12. 二、nginx搭建图片服务器
  13. scrapy 修改URL爬取起始位置
  14. Word Embedding/RNN/LSTM
  15. multiple definition of XXX情况分析
  16. (转)拉姆达表达式(Lambda Expressions) =&gt;写法的涵义
  17. Lucene 学习-安装 Kibana 视图界面
  18. C# 生成随机订单号
  19. 线程池ThreadPoolExecutor使用原理
  20. 彻底搞懂 SQLAlchemy中的 backref

热门文章

  1. 【递归】P1706全排列问题
  2. 算法历练之路——入学考试(JAVA)
  3. (十一)time模块
  4. 计算起始车站车费问题-JavaScript数组对象写法
  5. 集成多种协议、用于 USB-A 和 TYPE-C 双端口输出的快充协议芯片IP2726
  6. Python入门之修改jupyter启动目录
  7. js中常用追加元素的几种方法
  8. 前端知识(二)01-NPM包管理器-谷粒学院
  9. (07)-Python3之--函数
  10. C#高级编程第11版 - 第五章 索引