博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P2900 [USACO08MAR]土地征用Land Acquisition(斜率优化)
阅读量:4323 次
发布时间:2019-06-06

本文共 1702 字,大约阅读时间需要 5 分钟。

题意

约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地。如果约翰单买一块土 地,价格就是土地的面积。但他可以选择并购一组土地,并购的价格为这些土地中最大的长 乘以最大的宽。比如约翰并购一块3 × 5和一块5 × 3的土地,他只需要支付5 × 5 = 25元, 比单买合算。 约翰希望买下所有的土地。他发现,将这些土地分成不同的小组来并购可以节省经费。 给定每份土地的尺寸,请你帮助他计算购买所有土地所需的最小费用。

 

题解

  一道斜率优化

  我们先考虑一下,如果某一块土地的长和宽小于等于另一块土地,那么这两块土地可以合并,这块土地可以和另一块一起买

  所以我们按长为第一关键字,宽为第二关键字,升序排序,那么如果一块土地的长和宽都小于右边的,我们就可以把这块土地忽略不计(相当于合并到另一块里),那么最后留下的土地一定是长度递增,宽度递减的。那么在这一种情况下我们选取的土地一定是连续的一段。为什么呢?假设有$k<j<i$三块土地,那么$w[k]<w[j]<w[i]$且$h[k]>h[j]>h[i]$,那么一起买,花费为$w[i]*h[k]$,而如果不是一起买,即选取的不是连续的区间,比如买$i,k$再买$j$,那么花费就是$w[i]*h[k]+w[j]*h[j]$,不如之前的方案优

  然后就可以列出转移方程$$dp[i]=min\{dp[j]+h[j+1]*w[i]\}$$

  假设$j$比$k$更优,则有$$dp[j]+h[j+1]*w[i]<dp[k]+h[k+1]*w[i]$$

  $$dp[j]-dp[k]<h[k+1]*w[i]-h[j+1]*w[i]$$

  $$\frac{dp[j]-dp[k]}{h[k+1]-h[j+1]}<w[i]$$

  然后就可以上斜率优化了

1 //minamoto 2 #include
3 #include
4 #include
5 #define ll long long 6 using namespace std; 7 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 8 char buf[1<<21],*p1=buf,*p2=buf; 9 inline int read(){10 #define num ch-'0'11 char ch;bool flag=0;int res;12 while(!isdigit(ch=getc()))13 (ch=='-')&&(flag=true);14 for(res=num;isdigit(ch=getc());res=res*10+num);15 (flag)&&(res=-res);16 #undef num17 return res;18 }19 const int N=50005;20 struct node{21 int x,y;22 inline bool operator <(const node b)const23 {
return x==b.x?y
=b[tot].y) --tot;34 b[++tot]=a[i];35 }36 for(int i=1;i<=tot;++i){37 while(h
slope(q[t-1],i)) --t;q[++t]=i;40 }41 printf("%lld\n",f[tot]);42 return 0;43 }

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9545913.html

你可能感兴趣的文章
C# 创建单例窗体封装
查看>>
移动端报表如何获取当前地理位置
查看>>
spring 源码
查看>>
使用 opencv 将图片压缩到指定文件尺寸
查看>>
linux中~和/的区别
查看>>
在vue-cli项目中使用bootstrap的方法示例
查看>>
jmeter的元件作用域与执行顺序
查看>>
echarts学习笔记 01
查看>>
PrimeNG安装使用
查看>>
iOS 打包
查看>>
.NET Core中的数据保护组件
查看>>
华为云软件开发云:容器DevOps,原来如此简单!
查看>>
MyEclipse 快捷键(转载)
查看>>
03链栈_LinkStack--(栈与队列)
查看>>
会滚段
查看>>
MANIFEST.MF的用途(转载)
查看>>
react高阶组件
查看>>
Android 高手进阶,自己定义圆形进度条
查看>>
Objective-C路成魔【2-Objective-C 规划】
查看>>
Java之旅(三)--- JSTL和EL表情
查看>>