【题目描述】

农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000).

每块土地的价格是它的面积,但FJ可以同时购买多快土地. 这些土地的价格是它们最大的长乘以它们最大的宽, 但是土地的长宽不能交换. 如果FJ买一块3x5的地和一块5x3的地,则他需要付5x5=25.

FJ希望买下所有的土地,但是他发现分组来买这些土地可以节省经费. 他需要你帮助他找到最小的经费.

【输入格式】

  • 第1行: 一个数: N
  • 第2..N+1行: 第i+1行包含两个数,分别为第i块土地的长和宽

【输出格式】

  • 第一行: 最小的可行费用.

【分析】

这是一道动态规划的题目,设长宽分别为l与w。

首先,我们进行预处理,将矩阵按照l递减(主关键字),w递增(次关键字)的顺序排序,

很容易看到的是,如果有两个矩阵i和j,满足l[j]>l[i]并且w[j]>w[i],那么这个矩阵可以完全删除掉,因为在买这个大矩阵j的同时可以把i也顺带买了,这样可以保证排序是唯一确定的。

接下来,设f(i)为前i个矩阵所需要的最小花费,得到朴素递推方程:

f[i]=min{f[j]+l[j+1]*w[i]}(j<i)

复杂度是O(n^2),显然会超时。

考虑斜率优化:

现在有两个决策f[j]与f[k],其中j<k。

假设f[i]从f[j]转移过来比从f[k]转移过来要更优,即:

f[j]+l[j+1]*w[i]<f[k]+l[k+1]*w[i]

两边移一下,得到:

W[i]<(f[k]-f[j])/(l[j+1]-l[k+1])

为了方便,我们不妨将l数组往前提一位(即l[i]=l[i+1]),

g[j,k] = (f[k]-f[j])/(l[j] - l[k])

则如果g[j,k] > w[i] 表示j比k更优。则k可以舍弃掉。

进而我们发现,当c < b < a < i时,如果有g[c, b] > g[b, a],那么b永远都不会成为计算f[i]时的决策点,为什么呢?
证明:
如果g[c, b] > g[b, a],那么我们可以分两个方面考虑g[c, b]与的关系:
  (1)如果g[c, b] > =y[i],那么决策c不会比决策b差,也就说决策b不可能是决策点
  (2)如果g[c, b] < y[i],那么由于g[c, b] > g[b, a],那么g[b, a] < y[i],那么决策a要比决策b好,所以b也不能作为决策点。

我们用一个队列来实现上面的规则,使得时间复杂度下降。

我们现在在满足以上性质的一个队列Q中插入一个新的矩阵i.

1、我们要判断第一个条件,得到:

w[i]*(l[Q[front]]-l[Q[front+1]])>(f[Q[front+1]]-f[Q[front]])

如果成立,说明上面的公式说明的是g[front,front+1]<w[i],即front+1要优于front,所以把front踢出队列,直到不可以再踢进行状态的转移。

2、我们要判断第二个条件,得到:

(l[Q[rear]]-l[i])*(f[Q[rear]]-f[Q[rear-1]])>(l[Q[rear-1]]-l[Q[rear]])*(f[i]-f[Q[rear]])

说明的是对于i,rear,rear-1三个元素来说,有g[rear-1,rear]<g[rear,i],显然,把rear踢出队列,直到不可以再踢时在队尾插入i。

显然对于每个元素来说,都要一次插入与一次弹出,所以复杂度为O(n)。

 1 #include <cstdlib>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cmath>
 6 #include <algorithm>
 7 const int maxn=50010;
 8 const int INF=0x7fffffff;
 9 using namespace std;
10 struct matrix
11 {
12        long long l,w;//长与宽
13        //重载运算符
14        bool operator <(const matrix &b)const
15        {
16             if (l==b.l) return b.w<w;
17             return b.l<l;
18        }
19 }data[maxn];
20 long long l[maxn],w[maxn],f[maxn];
21 int Q[maxn];//Q代表队列
22
23 int main()
24 {
25     int i,j,n,cnt=0;
26     memset(l,0,sizeof(l));
27     memset(w,0,sizeof(w));
28     memset(f,0,sizeof(f));
29
30     scanf("%d",&n);
31     for (i=1;i<=n;i++) scanf("%lld%lld",&data[i].l,&data[i].w);
32     sort(data+1,data+1+n);//长度递减
33     for (i=1;i<=n;i++)
34     //代表高度需要递增
35     if (cnt==0 || data[i].w>w[cnt])
36     {
37         cnt++;
38         w[cnt]=data[i].w;
39         l[cnt]=data[i].l;
40     }
41     for(i=0;i<cnt;i++)  l[i]=l[i+1];//千万要注意!
42
43     int front=1,rear=1;
44     Q[1]=0;
45     for (i=1;i<=cnt;i++)
46     {
47         while (front<rear && w[i]*(l[Q[front]]-l[Q[front+1]])>(f[Q[front+1]]-f[Q[front]]))
48         front++;
49         f[i]=f[Q[front]]+l[Q[front]]*w[i];
50         while (front<rear && (l[Q[rear]]-l[i])*(f[Q[rear]]-f[Q[rear-1]])>(l[Q[rear-1]]-l[Q[rear]])*(f[i]-f[Q[rear]]))
51         rear--;
52         Q[++rear]=i;
53     }
54
55     printf("%lld\n",f[cnt]);
56     return 0;
57 }

View Code

转载于:https://www.cnblogs.com/hoskey/p/3731110.html

【Usaco2008 Mar】土地购买相关推荐

  1. BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

    既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...

  2. bzoj1597[Usaco2008 Mar]土地购买

    bzoj1597[Usaco2008 Mar]土地购买 题意: n块土地,现在要求把土地分成几份,每份费用为该份中土地长最大值和宽最大值成绩,要求最小费用.n≤5000 题解: 当一块土地长宽都比另一 ...

  3. 【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3601  Solved: 1322 Descri ...

  4. 决策单调性Ⅱ:斜率优化(1597: [Usaco2008 Mar]土地购买)

    决策单调性Ⅰ:四边形不等式: http://blog.csdn.net/jaihk662/article/details/78174717 决策单调性: 对于dp[i] = min(dp[i], dp ...

  5. bzoj 1597: [Usaco2008 Mar]土地购买(斜率优化dp 例题)

    Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...

  6. BZOJ1597: [Usaco2008 Mar]土地购买(dp 斜率优化)

    题意 题目链接 Sol 重新看了一遍斜率优化,感觉又有了一些新的认识. 首先把土地按照\((w, h)\)排序,用单调栈处理出每个位置第向左第一个比他大的位置,显然这中间的元素是没用的 设\(f[i] ...

  7. bzoj1597 [Usaco2008 Mar]土地购买

    题目描述 题解: 我们可以考虑这样一种情况,有一块$10*10$的土地,还有一块$1*1$的土地. 当然将$1*1$的土地合到$10*10$的土地中了. 所以我们可以先按土地$x$值从大到小排序,然后 ...

  8. bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 又一道斜率优化dp.负数让我混乱.不过仔细想想还是好的. 还可以方便地把那个负号放到x ...

  9. bzoj 1597: [Usaco2008 Mar]土地购买【斜率优化】

    按xy降序排序,把能被完全包含的去掉 然后就得到了x升序y降序的一个数组 然后方程就显然了:f[i]=min(f[j]+y[j+1]x[i]) 斜率优化转移 说起来我还不会斜率优化呢是不是该学一下了 ...

  10. BZOJ 1597 [Usaco2008 Mar] 土地购买

    题意:中文题意,自行理解: 思路:这个题和hdu 1300 的题很像,算是一种类似于二维的扩展,题目不是很难,但窝发现网上的一些题解有些地方说的不是很清楚,在计算斜率优化式的时候,tzw大牛的博客里适 ...

最新文章

  1. 对称加密DES和TripleDES
  2. Linux IO多路复用之epoll网络编程(含源码)
  3. 【poj3208-Apocalypse Someday】数位DP
  4. java mongodb 使用MongoCollection,BasicDBObject 条件查询
  5. Dubbo 只注册,只订阅
  6. 两圆相交求面积 hdu5120
  7. 谱聚类(spectral clustering)原理总结
  8. 问题三十六:ray tracing中的Inverse Mapping(0)——概要
  9. WPF版的权限管理系统
  10. 启发式搜索 (Heuristically Search)-【贪婪最佳优先搜索】和【A*搜索】
  11. 迷宫里抓神兽Java游戏_塞尔达传说荒野之息全神兽迷宫进入方法 四大神兽怎么打?-游侠网...
  12. 动手学Pytorch深度学习建模与应用
  13. 数据结构之树(3)——二叉平衡树(AVL)
  14. 一级域名、二级域名、三级域名区分
  15. Autosar之EB的安装与激活
  16. 【LEETCODE】【鱼缸难题】
  17. [poj3130][半平面交]How I Mathematician Wonder What You Are!
  18. js钢琴(含钢琴按键音效包)
  19. VmatrixOJ--IP and QQ
  20. 4.微信登入小程序与后端实现

热门文章

  1. 计算机相关国内外文献,计算机外文文献
  2. 二极管的分类、电路符号及万用表测发光二极管正负极
  3. 高瓴张磊:从学渣到投资大佬,也曾多次犯错
  4. 数据分析师是做什么的?数据分析师岗位职责
  5. 四、量子纠缠状态及其应用
  6. Excel如何制作直方图与正态分布曲线
  7. singleLine属性
  8. composer 安装php endroid/qrcode二维码应用,二维码里面添加logo
  9. Html+Css 3D旋转立方体
  10. layui 图片剪切/截取