【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1096

【题目大意】

  有个斜坡,有n个仓库,每个仓库里面都有一些物品,物品数目为p,仓库位置为x,修缮仓库需要的费用为c,现在下雨了,之后修缮的仓库才能放东西,别的地方的仓库要运东西过来,但是只能往比它地势低的运,问所有物品得到保障的最小代价。

【题解】

  显然可以从高处往低处做DP,dp[i]=min(dp[j]+cost(i,j))

  我们记s[i]为p[i]的前缀和,b[i]为x[i]*p[i]的前缀和

  那么有dp[i]=min(dp[j]+(s[i]-s[j])*x[i]-(b[i]-b[j])+c[i])

  当j>k且j比k更优时有:dp[j]-dp[k]+b[j]-b[k]<(sum[j]-sum[k])*x[i],可斜率优化。

【代码】

#include <cstdio>
using namespace std;
typedef long long ll;
const int N=1000010;
int n,l,r,q[N];
ll p[N],x[N],c[N],dp[N],b[N],s[N];
double slop(int k,int j){return double(dp[j]-dp[k]+b[j]-b[k])/double(s[j]-s[k]);}
int main(){
scanf("%d\n",&n);
for(int i=1;i<=n;i++)scanf("%lld%lld%lld",&x[i],&p[i],&c[i]);
for(int i=1;i<=n;i++){s[i]=s[i-1]+p[i];b[i]=b[i-1]+p[i]*x[i];}
for(int i=1;i<=n;i++){
while(l<r&&slop(q[l],q[l+1])<x[i])l++;
int t=q[l];
dp[i]=dp[t]-b[i]+b[t]+(s[i]-s[t])*x[i]+c[i];
while(l<r&&slop(q[r-1],q[r])>slop(q[r],i))r--;
q[++r]=i;
}return printf("%lld",dp[n]),0;
}

  

最新文章

  1. Spring框架概述
  2. 一个C++版的嵌入式操作系统
  3. Shell 快捷键
  4. ORACLE执行详解
  5. LeetCode-Sort Colors
  6. Mysql常用数据类型
  7. as的Enter_Frame与Timer
  8. 关于javax.crypto.BadPaddingException: Blocktype错误的几种解决方法
  9. hexo常用命令笔记
  10. BZOJ 3479: [Usaco2014 Mar]Watering the Fields(最小生成树)
  11. mysql如何执行关联查询与优化
  12. “你什么意思”之基于RNN的语义槽填充(Pytorch实现)
  13. 集合之TreeMap(含JDK1.8源码分析)
  14. Confluence 6 导入模板的步骤
  15. jQuery插件slider实现图片轮播
  16. Oracle数据库三种备份方案
  17. webpack快速入门——CSS进阶,Less文件的打包和分离
  18. [Swift实际操作]七、常见概念-(2)点CGPoint和变形CGAffineTransform的使用
  19. 服务器返回的“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0提供程序””错误解决
  20. selenium grid应用1-多浏览器执行用例

热门文章

  1. 【转】Pjax是什么以及为什么推荐大家用
  2. [LeetCode]题解(python):147-Insertion Sort List
  3. erlang学习笔记(1)
  4. GitHub 菜鸟使用
  5. SQL Server 恢复过程
  6. Android中pendingIntent的深入理解
  7. 07.15 first与first-child的区别
  8. 使用AFNetworking请求新浪微博数据接口出错解决办法
  9. Swift初体验(三)
  10. Boost.Asio c++ 网络编程翻译(14)