[bzoj1597][usaco2008 mar]土地购买 (动态规划+斜率优化)
Description
农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地的价格是它的面积,但FJ可以同时购买多快土地. 这些土地的价格是它们最大的长乘以它们最大的宽, 但是土地的长宽不能交换. 如果FJ买一块3x5的地和一块5x3的地,则他需要付5x5=25. FJ希望买下所有的土地,但是他发现分组来买这些土地可以节省经费. 他需要你帮助他找到最小的经费.
Input
* 第1行: 一个数: N
* 第2..N+1行: 第i+1行包含两个数,分别为第i块土地的长和宽
Output
* 第一行: 最小的可行费用.
Sample Input
输入解释:
共有4块土地.
Sample Output
HINT
FJ分3组买这些土地: 第一组:100x1, 第二组1x100, 第三组20x5 和 15x15 plot. 每组的价格分别为100,100,300, 总共500.
Solution
第一道斜率优化题。
看到题目,我们可以发现,对于每一个长宽较大的土地,在包括它的组别中,比它长和宽都小的土地不会对结果产生影响
所以我们先对土地以长为第一关键字,宽为第二关键字进行排序,将被大土地包含的小矩形删除
那么朴素的动态规划方程如下
f[i]=min{f[j]+x[i]*y[j+1]}
现在进行斜率优化
设原式中的f[j]+x[i]*y[j+1]为V式
若对于a<b,v(a)>v(b),
(f[b]-f[a])/(y[a+1]-y[b+1])<x[a]
那么,把决策当作点画在平面直角坐标系上,维护决策函数下凸
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
typedef long long ll;
int n,q[N],tot;
ll x[N],y[N],f[N];
struct land{
ll x,y;
bool operator<(const land h)const{
if(!(x^h.x))
return y<h.y;
return x<h.x;
}
}a[N];
inline double slope(int a,int b){
return (f[b]-f[a])/(y[a+]-y[b+]);
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lld%lld",&a[i].x,&a[i].y);
sort(a+,a++n);
for(int i=;i<=n;i++){
while(tot&&a[i].y>=y[tot])tot--;
x[++tot]=a[i].x;y[tot]=a[i].y;
}
int l=,r=;
for(int i=;i<=tot;i++){
while(l<r&&slope(q[l],q[l+])<x[i])l++;
int t=q[l];
f[i]=f[t]+x[i]*y[t+];
while(l<r&&slope(q[r],i)<slope(q[r-],q[r]))r--;
q[++r]=i;
}
printf("%lld\n",f[tot]);
return ;
}
[bzoj1597][usaco2008 mar]土地购买 (动态规划+斜率优化)的更多相关文章
- [BZOJ1597][Usaco2008 Mar]土地购买(斜率优化)
		
Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...
 - 2018.09.10 bzoj1597: [Usaco2008 Mar]土地购买(斜率优化dp)
		
传送门 终究还是通宵了啊... 这是一道简单的斜率优化dp. 先对所有土地排序,显然如果有严格小于的两块土地不用考虑小的一块. 于是剩下的土地有一条边单增,另外一条单减. 我们假设a[i]是单减的,b ...
 - BZOJ1597: [Usaco2008 Mar]土地购买(dp 斜率优化)
		
题意 题目链接 Sol 重新看了一遍斜率优化,感觉又有了一些新的认识. 首先把土地按照\((w, h)\)排序,用单调栈处理出每个位置第向左第一个比他大的位置,显然这中间的元素是没用的 设\(f[i] ...
 - bzoj1597: [Usaco2008 Mar]土地购买 dp斜率优化
		
东风吹战鼓擂第一题土地购买送温暖 ★★★ 输入文件:acquire.in 输出文件:acquire.out 简单对比时间限制:1 s 内存限制:128 MB 农夫John准备扩大他的农 ...
 - BZOJ 1597: [Usaco2008 Mar]土地购买 动态规划 + 斜率优化
		
Code: #include<bits/stdc++.h> #define maxn 1000000 #define ll long long #define x(i) (b[i+1]) ...
 - 【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)
		
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3601 Solved: 1322 Descrip ...
 - BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )
		
既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...
 - BZOJ 1597: [Usaco2008 Mar]土地购买【斜率优化+凸包维护】
		
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4989 Solved: 1847[Submit] ...
 - 1597: [Usaco2008 Mar]土地购买 [ dp+斜率优化 ]  未完
		
传送门 1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1979 Solved: 705[Subm ...
 
随机推荐
- 【nodejs笔记2】认识express框架
			
app.js:启动文件,或者说入口文件package.json:存储着工程的信息及模块依赖,当在 dependencies 中添加依赖的模块时,运行 npm install,npm 会检查当前目录下的 ...
 - Hibernate(十)__缓存机制
			
为什么需要缓存? 缓存的作用主要用来提高性能,可以简单的理解成一个Map: 使 用缓存涉及到三个操作:把数据放入缓存.从缓存中获取数据. 删除缓存中的无效数据. 从上图看出: 当我们去查询对象的时候, ...
 - 使用TopSelf创建自宿主的Windows服务程序
			
在传统的Windows服务开发过程中,需要添加一个服务安装程序,里面写安装,启动和停止服务等逻辑.现在,使用TopSelf可以简化这个过程. 首先,继承 ServiceControl 写一个应用服务类 ...
 - 《IBM BPM实战指南》读书笔记
			
理论 BPM不是一个IT术语,更不是因技术的发展而起源的,相反,BPM自始至终都是管理学的术语和概念.它关注的一直都是效率.成本.利润.质量等核心问题.BPM是一门学科和一种方法论,只是现代的企业管理 ...
 - css中vertical-align垂直居中的认识
			
目标大纲 1.vertical-align为何不起作用?? vertical-align只钟情于“inline-block内联块级元素/inline元素” vertical-align属性 text- ...
 - 推荐15款制作 SVG 动画的 JavaScript 库
			
在当今时代,SVG是最流行的和正在被众多的设计人员和开发人员使用,创建支持视网膜和响应式的网页设计.绘制SVG不是一个艰巨的任务,因为大量的 JavaScript 库可与 SVG 图像搭配使用.这些J ...
 - 单行文字滚动就用myslider
			
单行文字滚动就用myslider,myslider是一个小型的内容滚动jquery插件. 首先请看实例:http://keleyi.com/jq/myslider/demo/4.htm 然后来看代码: ...
 - IOS开发基础知识--碎片16
			
1:Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id) 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断对象类型 -(BOO ...
 - Android进度条学习
			
自定义属性 <!-- roundColor 圆环的颜色 roundProgressColor 进度的颜色 roundWidth 圆环的宽度 textColor 文字颜色 textSize 文字大 ...
 - Java暗箱操作之自动装箱与拆箱
			
我以前在写Android项目的时候,估计写得最多最熟练的几句话就是: List<Integer> list = new ArrayList<Integer>(); list.a ...