【斜率DP】bzoj1597: [Usaco2008 Mar]土地购买
2015-09-23 16:16
148 查看
1597: [Usaco2008 Mar]土地购买
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2474 Solved: 900
[Submit][Status][Discuss]
Description
农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地的价格是它的面积,但FJ可以同时购买多快土地. 这些土地的价格是它们最大的长乘以它们最大的宽, 但是土地的长宽不能交换. 如果FJ买一块3x5的地和一块5x3的地,则他需要付5x5=25. FJ希望买下所有的土地,但是他发现分组来买这些土地可以节省经费. 他需要你帮助他找到最小的经费.Input
* 第1行: 一个数: N* 第2..N+1行: 第i+1行包含两个数,分别为第i块土地的长和宽
Output
* 第一行: 最小的可行费用.Sample Input
4100 1
15 15
20 5
1 100
输入解释:
共有4块土地.
Sample Output
500HINT
FJ分3组买这些土地: 第一组:100x1, 第二组1x100, 第三组20x5 和 15x15 plot. 每组的价格分别为100,100,300, 总共500先按x,y递增排序。。
然后把那些可以被包含的土地删了
剩下的土地x递增y递减
然后转移方程f[i]=min(f[j]+y[j+1]*x[i]).
斜率方程(f[j]-f[k])/(y[k+1]-y[j+1])<x[i]
差不多了。。
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define maxn 50001 using namespace std; struct ed{ int x,y; }edge[maxn],E[maxn]; long long f[maxn]; double K(int x,int y){return (double)(f[y]-f[x])/(E[x+1].y-E[y+1].y);} int que[maxn],n; void DP() { int head=1,tail=1; for(int i=1;i<=n;i++) { while(head<tail && K(que[head],que[head+1])<E[i].x)head++; int sd=que[head]; f[i]=f[sd]+(long long)E[sd+1].y*E[i].x; while(head<tail && K(que[tail],i)<K(que[tail-1],que[tail]))tail--; que[++tail]=i; } printf("%lld",f ); } bool cmp(const ed A,const ed B) { if(A.x==B.x)return A.y<B.y; return A.x<B.x; } int main() { int b=0; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&edge[i].x,&edge[i].y); sort(1+edge,1+edge+n,cmp); for(int i=n;i>=2;i--) { if(edge[i].y>=edge[i-1].y) { swap(edge[i],edge[i-1]); n--; } else swap(E[++b],edge[i]); } swap(E[++b],edge[1]); sort(1+E,1+E+n,cmp); DP(); return 0; }
View Code
相关文章推荐
- Android利用Filter过滤数据
- MSSQL 关于16进制与字符串以及10进制的简单转换,以及SQL的16进制的截取
- PAT(甲级)1007
- win7 下启动mysql
- 树套树
- 测试用例
- np_xtcxyczjh-III 整理I[小公码(宏 错误包装) Makefile]
- 工厂模式 Factory Pattern
- vs项目中使用c++调用lua5.1
- 聊聊编程范式
- 已经为类型参数“Chart”指定了 constraint 子句。必须在单个 where 子句中指定类型参数的所有约束
- test5.22
- Spring中的数据库操作--使用JdbcTemplate
- 在Android中查看和管理sqlite数据库
- mysql中int、bigint、smallint 和 tinyint的区别
- 二叉树的基本操作
- 腾讯校招面试经验
- 使用C++的类模板实现Stack类
- java中注解的使用与实例(一)
- LA2995(迭代更新)