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 ...
随机推荐
- Python数据分析(四)DataFrame, Series, ndarray, list, dict, tuple的相互转换
转自:https://blog.csdn.net/lambsnow/article/details/78517340 import numpy as np import pandas as pd ## ...
- BZOJ4753 JSOI2016最佳团体(分数规划+树形dp)
看到比值先二分答案.于是转化成一个非常裸的树形背包.直接暴力背包的话复杂度就是O(n2),因为相当于在lca处枚举每个点对.这里使用一种更通用的dfs序优化树形背包写法.https://www.cnb ...
- BZOJ4399 魔法少女LJJ(线段树合并)
注意到只有增加点/合并的操作.这些操作都可以用线段树完成,于是线段树合并一发就好了.注意乘积大小直接比较肯定会炸,取个对数即可.数据中存在重边. #include<iostream> #i ...
- redux的基本概念
1. State 应用的数据,即状态 2. Action 一个纯对象,携带这个操作的类型和数据信息,主要是用来进行传递信息,如下所示: const action = { type: 'ADD_TODO ...
- [WC2007]剪刀石头布——费用流
比较有思维含量的一道题 题意:给混合完全图定向(定向为竞赛图)使得有最多的三元环 三元环条件要求比较高,还不容易分开处理. 正难则反 考虑,什么情况下,三元组不是三元环 一定是一个点有2个入度,一个点 ...
- Maven如何打包本地依赖包
有的jar包,在maven中心库里面是没有的,那么,如何在项目中使用呢? 假设我们需要使用:apache-ant-zip-2.3.jar 将该jar包,放在项目的lib目录,例如: 在pom.xml里 ...
- HDU 1556 线段树/树状数组/区间更新姿势 三种方法处理
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- git 的证书重新设置,以及如何让git 记住提交的用户名和密码
1.git 的证书的重新设置的命令是: git config --system --unset credential.helper 2.保存git的用户名和密码注意这里是全局保存 git config ...
- hbase vs mongodb
1.HBase依赖于HDFS,HBase按照列族将数据存储在不同的hdfs文件中:MongoDB直接存储在本地磁盘中,MongoDB不分列,整个文档都存储在一个(或者说一组)文件中 (存储) 2.Mo ...
- vue+koa+mysql简易demo
功能支持网址收藏编辑 代码: https://github.com/lanleilin/lanOdyssey/tree/master/vueKoa/webCollection1 运行方法: 在serv ...