题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1597

题意:

  有n块矩形土地,长为a[i],宽为b[i]。

  FJ想要将这n块土地全部买下来。

  土地可以分组购买。

  若有某一些土地被分到了一组,则将这一组土地全部买下的花费为他们的max(a[i])*max(b[i])。

  问你最小总花费是多少。

题解:

  首先,如果一块土地能够被另一块土地完全包含(即长宽都比另一个小),那么被包含的那块土地可以忽略不计。

  然后贪心地考虑如何使花费最小:

    如果要使花费尽可能小,则分在同一组中矩形的长宽差距应尽可能地小。

  所以将长a[i]作为第一关键字,将宽b[i]作为第二关键字排序。

  此时矩形的长a[i]一定是非降的,那么对于两个矩形i和j(i<j),如果有b[i]<=b[j],则j一定能完全包含i。

  利用这一特性将所有能被包含的矩形去掉。

  此时矩形的宽b[i]就变成了严格递减的了。

  显然,此时分到一组中的矩形必须是连续的一段区间,才有可能最优。

  然后就可以dp了。

  表示状态:

    dp[i]表示已经购买了前i块土地的最小花费。

  找出答案:

    假设去掉能被包含的矩形之后,矩形总数为tot。

    ans = dp[tot]

  如何转移:

    dp[i] = min dp[j] + a[i]*b[j+1]

  边界条件:

    dp[0] = 0

  斜率优化:

    设j < k,且k的决策更优。

    则:dp[j] + a[i]*b[j+1] > dp[k] + a[i]*b[k+1]

    整理得:(dp[k]-dp[j])/(b[j+1]-b[k+1]) < a[i]

    所以slope(i,j) = (dp[i]-dp[j])/(b[j+1]-b[i+1])

    由于a[i]非降,所以用单调队列维护下凸壳即可。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAX_N 50005 using namespace std; struct Rect
{
long long a,b;
Rect(long long _a,long long _b)
{
a=_a; b=_b;
}
Rect(){}
friend bool operator < (const Rect &x,const Rect &y)
{
return x.a!=y.a ? x.a<y.a : x.b<y.b;
}
}; int n;
int q[MAX_N];
long long dp[MAX_N];
Rect x[MAX_N]; void read()
{
cin>>n;
for(int i=;i<=n;i++)
{
cin>>x[i].a>>x[i].b;
}
} inline double slope(int i,int j)
{
return (double)(dp[i]-dp[j])/(x[j+].b-x[i+].b);
} void work()
{
sort(x+,x++n);
int tot=;
for(int i=;i<=n;i++)
{
while(tot && x[i].b>=x[tot].b) tot--;
x[++tot]=x[i];
}
x[tot+]=Rect(,);
int l=,r=;
q[]=,dp[]=;
for(int i=;i<=tot;i++)
{
while(l<r && slope(q[l],q[l+])<=x[i].a) l++;
dp[i]=dp[q[l]]+x[i].a*x[q[l]+].b;
while(l<r && slope(q[r],i)<slope(q[r-],q[r])) r--;
q[++r]=i;
}
cout<<dp[tot]<<endl;
} int main()
{
read();
work();
}

BZOJ 1597 [Usaco2008 Mar]土地购买:斜率优化dp的更多相关文章

  1. BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4026  Solved: 1473[Submit] ...

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

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

  3. BZOJ 1597: [Usaco2008 Mar]土地购买 斜率优化

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MB Description 农夫John准备扩大他的农场,他正在考虑N ...

  4. bzoj1597[Usaco2008 Mar]土地购买 斜率优化dp

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5524  Solved: 2074[Submit] ...

  5. bzoj1597 [Usaco2008 Mar]土地购买——斜率优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 就是斜率优化水题... 然而WA了十几遍,正负号处理真让人心累... 还是该负就负,别 ...

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

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

  7. BZOJ 1597: [Usaco2008 Mar]土地购买【斜率优化+凸包维护】

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4989  Solved: 1847[Submit] ...

  8. 斜率优化专题1——bzoj 1597 [Usaco2008 Mar] 土地购买 题解

    转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24387147 [原题] 1597: [Usaco2008 Mar]土地购买 Time ...

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

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

随机推荐

  1. Thread 常搞混的几个概念sleep、wait、yield、interrupt

    sleep:在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响.该线程不丢失任何监视器的所属权. 通过调用sleep使任务进入休眠状态,在这种情况下 ...

  2. IOS开发中的分享到邮件

    本篇和UIWebView的全屏截图,可以一起使用,先对UIWebView进行截图,然后分享到邮箱(当时做还有分享到微信.腾讯微博.新浪微博功能,这三个根据官方资料,比较容易实现,这里就不进行解说了). ...

  3. oracle导出sql

    1.点击要导出的表2.右键点击exportData3.选择要导出的sql语句

  4. ionic新手教程第七课-简要说明几种界面之间的參数传递及优缺点

    截至2016年4月13日19点32分,我公布的ionic新手教程,已经公布6课了, 总訪问量将近6000,平均每节课能有1000的訪问量.当中訪客最多的是第三课有2700的訪客. watermark/ ...

  5. 【JMeter4.0学习(一)】之FTP性能测试脚本开发,并实现上传下载功能

    参考:<Jmeter常用脚本开发之FTP请求>感谢作者:rosa2015 一.首先,搭建FTP服务器,参考地址:<[FTP]之windows8.1上搭建FTP服务器方法> 二. ...

  6. MDwiki 调研

    下载解压 然后 mv mdwiki.html index.html 创建 一个index.md 然后就可以直接访问http://example.com/ 直接把你的md文件放在目录里面就可以了 cer ...

  7. 原创:解决 python中moviepy调用ffmpeg的错误:subprocess, PermissionError: [WinError 5] 拒绝访问

    近期运行一个python程序用到了moviepy.editor.VideoFileClip() moviepy基于ffmpeg,但是并不是pip安装的ffmepg, 执行 import imageio ...

  8. js 抢月饼

    面源码: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" co ...

  9. 使用MYCAT轻松实现MYSQL水平分片

    完整文章下载地址:http://download.csdn.net/detail/dreamcode/9383516 简单来说,我们能够将数据的水平切分理解为是依照数据行的切分.就是将表中的某些行切分 ...

  10. Android Studio报Error:Execution failed for task &#39;:Companion:preDexDebug&#39;.

    错误例如以下: Error:Execution failed for task ':Companion:preDexDebug'. > com.android.ide.common.proces ...