码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 1096--仓库建设(斜率优化DP)

时间:2017-10-31 20:16:09      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:mst   memory   ora   不同的   this   优化   string   方案   sample   

1096: [ZJOI2007]仓库建设

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 5320  Solved: 2366
[Submit][Status][Discuss]

Description

  L公司有N个工厂,由高到底分布在一座山上。如图所示,工厂1在山顶,工厂N在山脚。由于这座山处于高原内
陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用。突然有一天,L公司的总裁L先生接到气象
部门的电话,被告知三天之后将有一场暴雨,于是L先生决定紧急在某些工厂建立一些仓库以免产品被淋坏。由于
地形的不同,在不同工厂建立仓库的费用可能是不同的。第i个工厂目前已有成品Pi件,在第i个工厂位置建立仓库
的费用是Ci。对于没有建立仓库的工厂,其产品应被运往其他的仓库进行储藏,而由于L公司产品的对外销售处设
置在山脚的工厂N,故产品只能往山下运(即只能运往编号更大的工厂的仓库),当然运送产品也是需要费用的,
假设一件产品运送1个单位距离的费用是1。假设建立的仓库容量都都是足够大的,可以容下所有的产品。你将得到
以下数据:1:工厂i距离工厂1的距离Xi(其中X1=0);2:工厂i目前已有成品数量Pi;:3:在工厂i建立仓库的费用
Ci;请你帮助L公司寻找一个仓库建设的方案,使得总的费用(建造费用+运输费用)最小。

Input

  第一行包含一个整数N,表示工厂的个数。接下来N行每行包含两个整数Xi, Pi, Ci, 意义如题中所述。

Output

  仅包含一个整数,为可以找到最优方案的费用。

Sample Input

3
0 5 10
5 3 100
9 6 10

Sample Output

32

HINT

 

在工厂1和工厂3建立仓库,建立费用为10+10=20,运输费用为(9-5)*3 = 12,总费用32。如果仅在工厂3建立仓库,建立费用为10,运输费用为(9-0)*5+(9-5)*3=57,总费用67,不如前者优。

【数据规模】

对于100%的数据, N ≤1000000。 所有的Xi, Pi, Ci均在32位带符号整数以内,保证中间计算结果不超过64位带符号整数。 

 
 

题目链接:

    http://www.lydsy.com/JudgeOnline/problem.php?id=1091 

 

Solution

    套公式。。。。。

    已知: 距离 X [ i ] ,数量p [ i ] ,建立费用 C [ i ].

    设 : P [ i ] 为前 i 个仓库的数量总和 ,D [ i ] 为前 i 个仓库的 P [ i ] * X [ i ] 总和。(我也不知道怎么描述,只是计算用到。。。)

    显然有状态转移方程 :  f [ i ] = min ( f [ j ] + C [ i ] + ( P [ i ] - P [ j ] ) * X [ i ] - D [ i ] + D [ j ] )     j < i

    假设 k < j < i 并且决策点 j 比 k 更优。。。

    f [ j ] + C [ i ] + ( P [ i ] - P [ j ] ) * X [ i ] - D [ i ] + D [ j ]  < f [ k ] + C [ i ] + ( P [ i ] - P [ k ] ) * X [ i ] - D [ i ] + D [ k ]

    得到斜率式  : ( f [ j ] - f [ k ]  + D [ j ] -D [ k ] ) / ( P [ j ] - P [ k ] )  <  X [ i ]

    然后按照斜率优化的套路走。。。。。

代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define LL long long
#define N 1000050
using namespace std;
inline int Read(){
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
int n;
int q[N];
LL X[N],P[N],C[N],D[N],f[N];
double slope(int j,int k){
	return (double)(f[j]-f[k]+D[j]-D[k])/(double)(P[j]-P[k]);
}
int main(){
	n=Read();
	for(int i=1;i<=n;i++){
		X[i]=(LL)Read();P[i]=(LL)Read();C[i]=(LL)Read();
		D[i]=X[i]*P[i]+D[i-1];
		P[i]=P[i]+P[i-1];
	}
	int l=1,r=1;
	for(int i=1;i<=n;i++){
		while( l<r && slope(q[l+1],q[l])<=X[i])l++;
		f[i]=f[q[l]]+C[i]+(P[i]-P[q[l]])*X[i]-D[i]+D[q[l]];
		while( l<r && slope(q[r],q[r-1])>slope(i,q[r]))r--;
		q[++r]=i;
	}
	printf("%lld\n",f[n]);
	return 0;
}

  

  

This passage is made by Iscream-2001.

 

BZOJ 1096--仓库建设(斜率优化DP)

标签:mst   memory   ora   不同的   this   优化   string   方案   sample   

原文地址:http://www.cnblogs.com/Yuigahama/p/7762940.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!