题意

约翰准备扩大他的农场,眼前他正在考虑购买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]$$

  然后就可以上斜率优化了

 //minamoto
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=;
struct node{
int x,y;
inline bool operator <(const node b)const
{return x==b.x?y<b.y:x<b.x;}
}a[N],b[N];
ll f[N];int n,tot,h,t,q[N];
inline double slope(int j,int k){return (f[k]-f[j])/(b[j+].y-b[k+].y);}
int main(){
//freopen("testdata.in","r",stdin);
n=read();
for(int i=;i<=n;++i) a[i].x=read(),a[i].y=read();
sort(a+,a++n);
for(int i=;i<=n;++i){
while(tot&&a[i].y>=b[tot].y) --tot;
b[++tot]=a[i];
}
for(int i=;i<=tot;++i){
while(h<t&&slope(q[h],q[h+])<b[i].x) ++h;
f[i]=f[q[h]]+1ll*b[q[h]+].y*b[i].x;
while(h<t&&slope(q[t],q[t-])>slope(q[t-],i)) --t;q[++t]=i;
}
printf("%lld\n",f[tot]);
return ;
}

最新文章

  1. SQL Saturday活动再起
  2. JS原型对象通俗&quot;唱法&quot;
  3. jq 页面延时刷新
  4. 【OpenGL】交互式三次 Bezier 曲线
  5. [Everyday Mathematics]20150113
  6. pyqt labe界面超级链接例子学习
  7. Expedition(优先队列)
  8. theano安装
  9. JAVA G1收集器 第11节
  10. MySql连接异常解决
  11. PHP 中 static 和 self 的区别
  12. JAVA基础知识(2)--关键字final的使用
  13. 隐藏index.php
  14. IMCASH:2019年区块链不会风平浪静,至少还有10件事值得期待
  15. Linux安装mysql5.7
  16. 【CF429E】 Points and Segments(欧拉回路)
  17. 数据结构与算法之PHP排序算法(冒泡排序)
  18. 利用目录函数(opendir,readdir,closedir)查找文件个数
  19. 第三十二章 elk(3)- broker架构 + 引入logback
  20. MDF文件损坏,如何恢复?(未解决)

热门文章

  1. Servlet3.0之八:基于Servlet3.0的文件上传@MultipartConfig
  2. 已有项目使用Asset Pipeline管理静态资源
  3. findwindow\sendmessage向第三方软件发送消息演示
  4. 为什么in_array(0, [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;])返回true
  5. 1.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:
  6. LNMP 1.3 测试php解析
  7. win 10 提升权限
  8. Android Tombstone 分析
  9. openGL一些概念02
  10. springJunit测试