[USACO2008 Mar]土地购买
传送门:>HERE<
题意:购买一组土地的费用是最长的长乘以最长的宽。现给出n块土地,求购买所有土地(可以将土地分为任意组,不需按顺序)的最小费用
解题思路
动态规划+斜率优化
斜率优化在这道题里并不难,关键是第一步的方程以及思想
由于买一组土地的关键是最大的长和宽,所以设任意两块土地$x, y$,若$w[x] \leq w[y] 且 l[x] \leq l[y]$,那么我们可以把$x, y$放在一组里,这样x存不存在都一样。因此x就可以扔掉不管了。所以第一步我们可以把所有没用的都扔掉。
那么怎么扔呢?首先对所有土地以高度为第一关键字,宽度为第二关键字从小到大排序。直接利用单调栈踢出所有没用的土地——然后让每一块土地依次进栈,由于高度是单调递增的,那么如果当前土地的宽度 $\geq$ 栈顶的宽度,也就意味着栈顶那块就没用了,因此可以pop
这样做有什么好处?令$f[i]$表示购买前i块土地的费用,枚举断点j,得状态转移方程$$f[i] = f[j] + h[i] * w[j+1]$$由于现在栈内已经单调,根据递增与递减的性质,就可以O(1)求得这一区间土地长宽的最大最小值了
然后就可以做斜率优化的DP了。
Code
long long
坑点挺多的,调了一上午。先是x坐标移项之后是负的,并且栈溢出要判断,不然top减成负数了。
/*By QiXingzhi*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#define r read()
#define Max(a,b) (((a)>(b)) ? (a) : (b))
#define Min(a,b) (((a)<(b)) ? (a) : (b))
using namespace std;
typedef long long ll;
#define int long long
const int MAXN = ;
const int INF = ;
inline int read(){
int x = ; int w = ; register int c = getchar();
while(c ^ '-' && (c < '' || c > '')) c = getchar();
if(c == '-') w = -, c = getchar();
while(c >= '' && c <= '') x = (x << ) +(x << ) + c - '', c = getchar();
return x * w;
}
struct Land{ int w,h; }a[MAXN],A[MAXN];
int n,top,h,t,sta[MAXN],q[MAXN],f[MAXN];
inline bool comp(const Land& a, const Land& b){ return (a.h != b.h) ? a.h < b.h : a.w < b.w; }
inline double X(int i){ return -A[i+].w; }
inline double Y(int i){ return f[i]; }
inline double Slope(int i, int j){ return (double)(Y(i)-Y(j)) / (double)(X(i)-X(j)); }
main(){
n = r;
for(int i = ; i <= n; ++i) a[i].w = r, a[i].h = r;
sort(a+, a+n+, comp);
sta[++top] = ;
for(int i = ; i <= n; ++i){
while(top> && a[i].w >= a[sta[top]].w) --top;
sta[++top] = i;
}
for(int i = ; i <= top; ++i) A[i] = a[sta[i]];
for(int i = ; i <= top; ++i){
while(h<t && Slope(q[h],q[h+]) < A[i].h) ++h;
f[i] = f[q[h]] + A[q[h]+].w * A[i].h;
while(h<t && Slope(q[t],q[t-]) > Slope(q[t],i)) --t;
q[++t] = i;
}
printf("%lld", f[top]);
return ;
}
[USACO2008 Mar]土地购买的更多相关文章
- BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4026 Solved: 1473[Submit] ...
- 1597: [Usaco2008 Mar]土地购买
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4023 Solved: 1470[Submit] ...
- 【斜率DP】bzoj1597: [Usaco2008 Mar]土地购买
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2474 Solved: 900[Submit][ ...
- 【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] ...
- bzoj1597[Usaco2008 Mar]土地购买 斜率优化dp
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5524 Solved: 2074[Submit] ...
- 【bzoj1597】[Usaco2008 Mar]土地购买
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3739 Solved: 1376[Submit] ...
- BZOJ 1597: [Usaco2008 Mar]土地购买 斜率优化
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MB Description 农夫John准备扩大他的农场,他正在考虑N ...
- 1597: [Usaco2008 Mar]土地购买 [ dp+斜率优化 ] 未完
传送门 1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1979 Solved: 705[Subm ...
随机推荐
- OM1、OM2、OM3和OM4光纤之间的区别
“OM”stand for optical multi-mode,即光模式,是多模光纤表示光纤等级的标准.不同等级传输时的带宽和最大距离不同,从以下几个方面分析它们之间的区别. 一.OM1.OM2. ...
- python-re模块-54
import re # findall # search # match ret = re.findall('[a-z]+', 'eva egon yuan') # 返回所有满足匹配条件的结果,放在列 ...
- Podfile文件用法详解
https://www.jianshu.com/p/b8b889610b7e 2018.01.09 15:51* 字数 2343 阅读 6263评论 3喜欢 34 前言 iOS开发会经常用到cocoa ...
- 福州大学软件工程1816 | W班 第5次作业成绩排名
写在前面 汇总成绩排名链接 1.作业链接 第五次作业--项目选题报告(团队) 2.评分准则 本次作业映射总分为100分+贡献度得分,由以下部分组成: 选题报告内容(10分) 本组评审表设计(5分) 现 ...
- Python爬虫:爬取人人都是产品经理的数据
爬取内容: 人人都是产品经理首页(www.woshipm.com)左侧[最新文章]下如图样式的文章标题.浏览量和缩略图. 思路: 1. 用BeautifulSoup解析网页 变量名 = Beautif ...
- 2019省赛训练组队赛3.31周四-17fj
https://vjudge.net/contest/289558#overview A - Frog Therearex frogs and y chicken in a garden. Kim f ...
- 【Python3练习题 016】 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
这题得倒着推.第10天还没吃,就剩1个,说明第9天吃完一半再吃1个还剩1个,假设第9天还没吃之前有桃子p个,可得:p * 1/2 - 1 = 1,可得 p = 4.以此类推,即可手算出. 代码思路为: ...
- 给input标签添加默认提示文字
<input name="username" placeholder="请输入用户名" /> placeholder = "提示文字&qu ...
- pojo类自动生成序列化ID
自动生成序列化ID
- Python 基础知识----流程控制
判断语句 循环语句 嵌套