UVALive 5097 Cross the Wall
贪心思想,$dp$,斜率优化。
首先将人按照$w$从大到小排序,如果$w$一样,按$h$从大到小排。这样一来,某位置之后,比该位置$h$小的都是不需要考虑的。
因此,形成了如下图所示的结果:
即第一个人最宽,但是最矮,最后一个人最瘦但是最高。
接下来考虑这些人怎么挖洞。还是上图,如果第一个人和第三个人都是从同一个洞里通过的,那么中间那个肯定也可以从那个洞里通过的。
也就是说一定是连续的一段人从同一个洞通过,接下来的任务就是如何将这些人分段。
设$dp[i][j]$表示前$i$个人分成了$j$段的最小费用。那么,$dp[i][j]=min(dp[x][j-1]+w[x+1]*h[i])$。
直接算的话,时间复杂度是$O(n*n*k)$的,超时。可以斜率优化。
写出斜率式子后可以发现是维护一个类似下图的曲线:
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<ctime>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
char c = getchar();
x = ;
while(!isdigit(c)) c = getchar();
while(isdigit(c))
{
x = x * + c - '';
c = getchar();
}
} int n,k;
long long dp[][];
struct X
{
long long w,h;
}s[],tmp[];
int q[],f1,f2; bool cmp(X a,X b)
{
if(a.w!=b.w) return a.w>b.w;
return a.h>b.h;
} bool delete1(int t,int a,int b,int c)
{
if(dp[b][t]+s[b+].w*s[c].h<=dp[a][t]+s[a+].w*s[c].h) return ;
return ;
} bool delete2(int t,int a,int b,int c)
{
if( (dp[c][t]-dp[b][t])*(s[b+].w-s[a+].w)>=
(dp[b][t]-dp[a][t])*(s[c+].w-s[b+].w) ) return ;
return ;
} int main()
{
while(~scanf("%d%d",&n,&k))
{
k=min(n,k);
for(int i=;i<=n;i++) scanf("%lld%lld",&tmp[i].w,&tmp[i].h);
sort(tmp+,tmp++n,cmp); int sz=;
s[sz].h=tmp[].h; s[sz].w=tmp[].w;
for(int i=;i<=n;i++)
{
if(tmp[i].h<=s[sz].h) continue;
sz++; s[sz].h=tmp[i].h; s[sz].w=tmp[i].w;
} for(int i=;i<=sz;i++) dp[i][]=s[].w*s[i].h; for(int j=;j<=k;j++)
{
f1=f2=; q[] = j-;
for(int i=j;i<=sz;i++)
{
while()
{
if(f2-f1+<) break;
if(delete1(j-,q[f1],q[f1+],i)) f1++;
else break;
} dp[i][j]=dp[q[f1]][j-]+s[q[f1]+].w*s[i].h; while()
{
if(f2-f1+<) break;
if(delete2(j-,q[f2-],q[f2],i)) f2--;
else break;
} f2++; q[f2]=i;
}
} long long ans=dp[sz][];
for(int j=;j<=k;j++) ans=min(ans,dp[sz][j]);
printf("%lld\n",ans); }
return ;
}
UVALive 5097 Cross the Wall的更多相关文章
- hdu 3669 Cross the Wall(斜率优化DP)
题目连接:hdu 3669 Cross the Wall 题意: 现在有一面无限大的墙,现在有n个人,每个人都能看成一个矩形,宽是w,高是h,现在这n个人要通过这面墙,现在只能让你挖k个洞,每个洞不能 ...
- hdu3669 Cross the Wall
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327680/327680 K (Java/Others) Total Submissi ...
- HDU 3669 Cross the Wall
题目大意 给定 \(N\) 个矩形的宽和高, \((h_1, w_1), (h_2, w_2), \dots, (h_n w_n)\) . 现需要确定 \(k\) (\(k \le K\), \(K\ ...
- uvalive 3276 The Great Wall Game
题意: 一个n * n的棋盘上放着n个棋子,现在要求把这n个棋子用最少的步数移到同一条直线上,即同一列同一行或者同一对角线(两条).输出最少的步数(只能往四个方向移动,即正东,正西,正南,正北). 思 ...
- HDU 3669 Cross the Wall(斜率DP+预处理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3669 题目大意:有n(n<=50000)个矩形,每个矩形都有高和宽,你可以在墙上最多挖k个洞使得 ...
- 动态规划DP的斜率优化 个人浅解 附HDU 3669 Cross the Wall
首先要感谢叉姐的指导Orz 这一类问题的DP方程都有如下形式 dp[i] = w(i) + max/min(a(i)*b(j) + c(j)) ( 0 <= j < i ) 其中,b, c ...
- HDU 3669 [Cross the Wall] DP斜率优化
问题分析 首先,如果一个人的\(w\)和\(h\)均小于另一个人,那么这个人显然可以被省略.如果我们将剩下的人按\(w[i]\)递增排序,那么\(h[i]\)就是递减. 之后我们考虑DP. 我们设\( ...
- [kuangbin带你飞]专题二十 斜率DP
ID Origin Title 20 / 60 Problem A HDU 3507 Print Article 13 / 19 Problem B HDU 2829 Lawr ...
- KUANGBIN带你飞
KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题 //201 ...
随机推荐
- ZOJ 3496 Assignment | 二分+有上下界网络流
题目: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3496 大概意思:给你一个网络,有源汇,在保证最大流的情况下求下面两 ...
- [Leetcode] Unique binary search trees ii 唯一二叉搜索树
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
- 洛谷 P2387 [NOI2014]魔法森林 解题报告
P2387 [NOI2014]魔法森林 题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2 ...
- 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树
外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了 #include <cstdio> #include <v ...
- 【转载】How long is “too long” for MySQL Connections to sleep?
From:http://dba.stackexchange.com/questions/1558/how-long-is-too-long-for-mysql-connections-to-sleep ...
- Shell之基本用法
一:shell简介 1.什么是shell shell的中文意思是“外壳”,通俗地讲,shell是一个交互编程接口,通过获得用户输入来驱动操作系统内核完成指定工作.shell除了作为命令解释程序以外,还 ...
- 【BZOJ2738】矩阵乘法 [整体二分][树状数组]
矩阵乘法 Time Limit: 20 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 给你一个N*N的矩阵,不用算矩阵乘 ...
- 【BZOJ3675】【APIO2014】序列分割 [斜率优化DP]
序列分割 Time Limit: 40 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 小H最近迷上了一个分隔序列的游戏. ...
- 「6月雅礼集训 2017 Day2」A
[题目大意] 给出一棵树,求有多少对点(u,v)满足其路径上不存在两个点a,b满足(a,b)=1 n<=10^5 [题解] 考虑找出所有不符合的点对,共有n*ln(n)对,他们要么是祖先-> ...
- bzoj2811 [Apio2012]Guard
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2811 [题解] 首先我们先把没看到忍者的段去掉,可以用线段树做. 如果剩下的就是K,那么特判 ...