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 ...
随机推荐
- Linux 常用命令记录(学习笔记)
不同机器间文件传输(转自:http://www.zhimengzhe.com/mac/323324.html) scp是什么? scp是secure copy的简写,用于在Linux下进行远程拷贝文件 ...
- 自定义CheckBox
自定义android的CheckBox按钮图形有两个步骤三种方式: 第一步: 新建Android XML文件,类型选Drawable,根结点选selector,放置在drawable文件夹内,指定各种 ...
- Avito Cool Challenge 2018 A. B题解
A. Definite Game 题目链接:https://codeforces.com/contest/1081/problem/A 题意: 给出一个数v,然后让你可以重复多次减去一个数d,满足v% ...
- [HTML]去除li前面的小黑点,和ul、LI部分属性[转]
转摘自:http://blog.csdn.net/cqkxzyi/article/details/7606181 对于很多人用div来做网站时,总会用到,但在显示效果时前面总是会有一个小黑点,这个令很 ...
- netty的Udp单播、组播、广播实例+Java的Udp单播、组播、广播实例
网络上缺乏netty的udp的单播.组播案例,经过一番学习总结之后终于把这两个案例调通,下面把这两个案例的代码放在这里分享一下. 首先推荐博文: http://colobu.com/2014/10/2 ...
- python实现多个文件的分发
之前写的脚本只能分发一个配置,每次分发多个配置总要执行很多次,很不爽,于是就有了这个脚本 from multiprocessing import Process import paramiko imp ...
- tyvj1048 田忌赛马
描述 中国古代的历史故事“田忌赛马”是为大家所熟知的.话说齐王和田忌又要赛马了,他们各派出N匹马,每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱.现在每匹马的速 ...
- algorithm ch7 QuickSort
快速排序是基于分治模式的排序,它将数组a[p,...,r]分成两个子数组a[p,...q-1],a[q+1,...,r],使得a[p,...,q-1]中每个元素都小于a[q],而且小于等于a[q+1, ...
- LeetCode 191:number of one bits
题目就是: Write a function that takes an unsigned integer and returns the number of ’1' bits it has (als ...
- go的websocket实现
websocket分为握手和数据传输阶段,即进行了HTTP握手 + 双工的TCP连接 RFC协议文档在:http://tools.ietf.org/html/rfc6455 握手阶段 握手阶段就是普通 ...