【原标题】

1096: [ZJOI2007]仓库建设

Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 1998  Solved: 816

[

id=1096" style="color:blue; text-decoration:none">Submit][Status]

Description

L公司有N个工厂,由高究竟分布在一座山上。

如图所看到的,工厂1在山顶。工厂N在山脚。

因为这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用。

突然有一天,L公司的总裁L先生接到气象部门的电话,被告知三天之后将有一场暴雨,于是L先生决定紧急在某些工厂建立一些仓库以免产品被淋坏。因为地形的不同,在不同工厂建立仓库的费用可能是不同的。

第i个工厂眼下已有成品Pi件。在第i个工厂位置建立仓库的费用是Ci。对于没有建立仓库的工厂,其产品应被运往其它的仓库进行储藏。而因为L公司产品的对外销售处设置在山脚的工厂N,故产品仅仅能往山下运(即仅仅能运往编号更大的工厂的仓库)。当然运送产品也是须要费用的,如果一件产品运送1个单位距离的费用是1。如果建立的仓库容量都都是足够大的,能够容下全部的产品。你将得到下面数据:
工厂i距离工厂1的距离Xi(当中X1=0);  工厂i眼下已有成品数量Pi;  在工厂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,不如前者优。

【数据规模】对于20%的数据, N ≤500;对于40%的数据, N ≤10000;对于100%的数据, N ≤1000000。 全部的Xi, Pi, Ci均在32位带符号整数以内,保证中间计算结果不超过64位带符号整数。

【分析与解法】总结一下我的近期的斜率优化题目的通解。

首先声明一下。我不会证明斜率优化的正确性。大概打表或是看数据范围就知道了。

第一步:推出n^2的方程,通常是一维方程,并且通用格式是:f[i]=min/max(f[j]+G)

f[i]=min(f[j]+sum[i]-sum[j]-G[j]*(a[i].x-a[j].x)+a[i].c);

第二步:如果j<k。且k比j要优。

把刚才的方程写成f[k]+G1<f[j]+G2的形式。

f[k]+sum[i]-sum[k]-G[k]*(a[i].x-a[k].x)+a[i].c<f[j]+sum[i]-sum[j]-G[j]*(a[i].x-a[j].x)+a[i].c

第三步:然后把有关k、j的项移到左边,把有关i的项移到右边。

有时两边要同除一个数使得右边仅仅剩下与i有关的成分。

抵消f[k]-sum[k]-G[k]*(a[i].x-a[k].x)<f[j]-sum[j]-G[j]*(a[i].x-a[j].x)

化简f[k]-f[j]+sum[j]-sum[k]+G[k]*a[k].x-G[j]*a[j].x<a[i].x*(G[k]-G[j])

除去(f[k]-f[j]+sum[j]-sum[k]+G[k]*a[k].x-G[j]*a[j].x)/(G[k]-G[j])<a[i].x

如今,就已经推出了斜率,再套用单调队列就可以。

【代码】

#include<cstdio>
#include<algorithm>
#define N 1000005
using namespace std;
typedef long long ll;
struct arr{ll x,p,c;}a[N];
ll sum[N],G[N],f[N],q[N],n,i,j,h,t;
bool cmp(arr a,arr b){return a.x<b.x;};
double xie(long long k,long long j)
{
double temp=(f[k]-f[j]+sum[j]-sum[k]+G[k]*a[k].x*1.0-G[j]*a[j].x)/(G[k]-G[j]);
return temp;
}
int main()
{
scanf("%lld",&n);
for (i=1;i<=n;i++)
scanf("%lld%lld%lld",&a[i].x,&a[i].p,&a[i].c);
sort(a+1,a+n+1,cmp);
for (i=1;i<=n;i++)
sum[i]=sum[i-1]+G[i-1]*(a[i].x-a[i-1].x),G[i]=G[i-1]+a[i].p;
for (i=1;i<=n;i++)
{
while (h<t&&xie(q[h+1],q[h])<a[i].x) h++;
f[i]=f[q[h]]+sum[i]-sum[q[h]]-G[q[h]]*(a[i].x-a[q[h]].x)+a[i].c;
while (h<t&&xie(q[t],q[t-1])>xie(i,q[t])) t--;
q[++t]=i;
}
printf("%lld",f[n]);
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

边坡优化主题5——bzoj 1096 [ZJOI2007]仓库建设 解决问题的方法的更多相关文章

  1. BZOJ 1096: [ZJOI2007]仓库建设 [斜率优化DP]

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4201  Solved: 1851[Submit][Stat ...

  2. bzoj 1096 [ZJOI2007]仓库建设(关于斜率优化问题的总结)

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3234  Solved: 1388[Submit][Stat ...

  3. BZOJ 1096: [ZJOI2007]仓库建设( dp + 斜率优化 )

    dp(v) = min(dp(p)+cost(p,v))+C(v) 设sum(v) = ∑pi(1≤i≤v), cnt(v) = ∑pi*xi(1≤i≤v), 则cost(p,v) = x(v)*(s ...

  4. bzoj 1096: [ZJOI2007]仓库建设 斜率優化

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2242  Solved: 925[Submit][Statu ...

  5. BZOJ 1096 ZJOI2007 仓库建设 边坡优化

    标题效果:特定n植物,其中一些建筑仓库,有一点使,假设没有仓库仓库向右仓库.最低消费要求 非常easy边坡优化--在此之前刷坡优化的情况下,即使这道题怎么错过 订购f[i]作为i点建设化妆i花费所有安 ...

  6. BZOJ 1096 [ZJOI2007]仓库建设(斜率优化DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1096 [题目大意] 有个斜坡,有n个仓库,每个仓库里面都有一些物品,物品数目为p,仓库 ...

  7. BZOJ 1096 [ZJOI2007]仓库建设:斜率优化dp

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1096 题意: 有n个工厂,从左往右排成一排,分别编号1到n. 每个工厂里有p[i]件产品, ...

  8. bzoj 1096: [ZJOI2007]仓库建设【斜率优化】

    好眼熟啊 直接dp显然很难算,所以设val为只在n点建一个仓库的费用,然后设f[i]为在i~n点建若干仓库并且i点一定建一个仓库的最大省钱数 转移很显然,设s为p的前缀和,f[i]=max{f[j]+ ...

  9. BZOJ 1096: [ZJOI2007]仓库建设(动态规划+斜率优化)

    第一次写斜率优化,发现其实也没啥难的,没打过就随便找了一份代码借(chao)鉴(xi)下,不要介意= = 题解实在是懒得写了,贴代码吧= = CODE: #include<cstdio># ...

随机推荐

  1. 开始AFNetworking

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠.支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 This ...

  2. Windows Azure使用体验

    Windows Azure在今年6月6日由世纪互联代理在中国运营,目前只能体验,没有开放注册.不过,体验的门槛比较高,只对企业开放,未来大量对外开放使用貌似时间还早.大家都懂得,“国内门槛高”.本人在 ...

  3. ConnectivityManager

    ConnectivityManager 主要管理网络连接的相关的类它主要负责的是1 监视网络连接状态 包括(Wi-Fi, GPRS, UMTS, etc)2 当网络状态改变时发送广播通知3 当网络连接 ...

  4. Shell printf 命令

    Shell printf 命令 printf 命令模仿 C 程序库(library)里的 printf() 程序. 标准所定义,因此使用printf的脚本比使用echo移植性好. printf 使用引 ...

  5. tsunami:一种基于UDP协议的高速传输

    一. 需求 近期在做数据库迁移.常常须要打包实例传输.传统scp感觉非常慢. 二. 软件信息 1. 软件主页:http://tsunami-udp.sf.net/ 2. 软件安装:直接源代码make ...

  6. ASP.NET常被忽视的一些细节

    原文:ASP.NET常被忽视的一些细节 前段时间碰到一个问题:为什么在ASP.NET程序中定时器有时候会不工作? 这个问题看起来很奇怪,代码好像也没错,但就是结果与预期不一致. 其实这里是ASP.NE ...

  7. jquery 设置select的默认值

    <select id="sel" > <option value="s1" > aaaa </option> <opt ...

  8. 关于Thread类中三个interrupt方法的研究与学习(转)

    先看三个方法原型: public void interrupt(): public boolean isInterrupted(): public static boolean interrupted ...

  9. 搜索:POJ2251&POJ1426&POJ3087&POJ2488

    图的遍历也称为搜索,就是从图中某个顶点出发,沿着一些边遍历图中所有的顶点,且每个顶点仅被访问一次,遍历可采取两种不同的方式:深度优先搜索(DFS)和广度优先搜索(BFS). 1.DFS算法思想` 从顶 ...

  10. 小侃#pragma

    #pragma是一个编译器指令. ================================================================ #pragma comment(li ...