luoguP1034 矩形覆盖 x
P1034 矩形覆盖
题目描述
在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示。例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一。

这些点可以用 k 个矩形(1<=k<=4)全部覆盖,矩形的边平行于坐标轴。当 k=2 时,可用如图二的两个矩形 sl,s2 覆盖,s1,s2 面积和为 4。问题是当 n 个点坐标和 k 给出后,怎样才能使得覆盖所有点的 k 个矩形的面积之和为最小呢。约定:覆盖一个点的矩形面积为 0;覆盖平行于坐标轴直线上点的矩形面积也为0。各个矩形必须完全分开(边线与顶点也都不能重合)。
输入输出格式
输入格式:
n k xl y1 x2 y2 ... ...
xn yn (0<=xi,yi<=500)
输出格式:
输出至屏幕。格式为:
一个整数,即满足条件的最小的矩形面积之和。
输入输出样例
4 2
1 1
2 2
3 6
0 7
4
思路:
dp
坑点:
原来这题k<=3(据说这题数据很水~)
上代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int M = ;
int n,k,l,r;
int dp[M][M][]; struct D{
int x,y;
bool operator < (const D &qwq) const
{///按y大小进行排序
if(y!=qwq.y) return y < qwq.y;
return x < qwq.x;
}
}point[M]; int main()
{
//freopen("jxfg.in","r",stdin);
//freopen("jxfg.out","w",stdout);
memset(dp,0x3f,sizeof(dp));
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%d%d",&point[i].x,&point[i].y);
sort(point+,point++n);
for(int i=;i<=n;i++)
{
l=r=point[i].x;
for(int j=i+;j<=n;j++)
{
l=min(l,point[j].x);
r=max(r,point[j].x);
dp[i][j][]=min(dp[i][j][],(point[j].y-point[i].y)*(r-l));
}
}
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int s=i+;s<j;s++)///mid
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int s=i+;s<j;s++)
dp[i][j][]=min(dp[i][j][],min((dp[i][s][]+dp[s+][j][]),(dp[i][s][]+dp[s+][j][])));
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int s=i+;s<j;s++)
{
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
}
printf("%d",dp[][n][k]);
return ;
}
你以为这样就完了吗???
!!!
我们在cogs上提交发现:
!!!WA2点!!!
坑点:
其实这里所讲的是暴力做法(WA纯属正常嘻嘻)
代码:(乱写加上了个特判的还是WA一个点的代码)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int M = ;
int n,k,l,r;
int dp[M][M][]; struct D{
int x,y;
bool operator < (const D &qwq) const
{///按y大小进行排序
if(y!=qwq.y) return y < qwq.y;
return x < qwq.x;
}
}point[M]; int main()
{
freopen("jxfg.in","r",stdin);
freopen("jxfg.out","w",stdout);
memset(dp,0x3f,sizeof(dp));
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%d%d",&point[i].x,&point[i].y);
sort(point+,point++n);
for(int i=;i<=n;i++)
{
l=r=point[i].x;
for(int j=i+;j<=n;j++)
{
l=min(l,point[j].x);
r=max(r,point[j].x);
dp[i][j][]=(point[j].y-point[i].y)*(r-l);
}
}
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int s=i+;s<j;s++)///mid
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int s=i+;s<=n;s++)
dp[i][j][]=min(dp[i][j][],min((dp[i][s][]+dp[s+][j][]),(dp[i][s][]+dp[s+][j][])));
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int s=i+;s<=n;s++)
{
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
}
if(dp[][n][k]==)
dp[][n][k]-=;
printf("%d",dp[][n][k]);
return ;
}
luoguP1034 矩形覆盖 x的更多相关文章
- [LuoguP1034][Noip2002] 矩形覆盖
[LuoguP1034][Noip2002] 矩形覆盖(Link) 在平面上有\(N\)个点,\(N\)不超过五十, 要求将这\(N\)个点用\(K\)个矩形覆盖,\(k\)不超过\(4\),要求最小 ...
- 【OpenJudge 1793】矩形覆盖
http://noi.openjudge.cn/ch0405/1793/ 好虐的一道题啊. 看数据范围,一眼状压,然后调了好长时间QwQ 很容易想到覆盖的点数作为状态,我用状态i表示至少覆盖状态i表示 ...
- NOIP2002矩形覆盖[几何DFS]
题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...
- bzoj 1185 旋转卡壳 最小矩形覆盖
题目大意 就是求一个最小矩形覆盖,逆时针输出其上面的点 这里可以看出,那个最小的矩形覆盖必然有一条边经过其中凸包上的两个点,另外三条边必然至少经过其中一个点,而这样的每一个点逆时针走一遍都满足单调性 ...
- [剑指OFFER] 斐波那契数列- 跳台阶 变态跳台阶 矩形覆盖
跳台阶 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. class Solution { public: int jumpFloor(int number) ...
- NOIP2002 矩形覆盖
题四 矩形覆盖(存盘名NOIPG4) [问题描述]: 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2), ...
- UVA-11983-Weird Advertisement(线段树+扫描线)[求矩形覆盖K次以上的面积]
题意: 求矩形覆盖K次以上的面积 分析: k很小,可以开K颗线段树,用sum[rt][i]来保存覆盖i次的区间和,K次以上全算K次 // File Name: 11983.cpp // Author: ...
- 【旋转卡壳+凸包】BZOJ1185:[HNOI2007]最小矩形覆盖
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1945 Solve ...
- BZOJ:1185: [HNOI2007]最小矩形覆盖
1185: [HNOI2007]最小矩形覆盖 这计算几何……果然很烦…… 发现自己不会旋转卡壳,补了下,然后发现求凸包也不会…… 凸包:找一个最左下的点,其他点按照与它连边的夹角排序,然后维护一个栈用 ...
随机推荐
- [转帖]开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
开源许可证GPL.BSD.MIT.Mozilla.Apache和LGPL的区别 https://www.geek-workshop.com/thread-1860-1-1.html liamj ...
- Linux系统下部署Tomcat服务器
详细步骤如下: 1.下载xshell5和xftp5并安装,登录连接服务器,新建会话窗口: 2.安装配置JDK1.8,具体操作方法如下: (1)下载JDK地址:http://www.oracle.com ...
- Configure脚本支持说明
在Linux上安装Nginx需要执行Configure脚本,该脚本需要做一些参数说明: 选项 说明 --prefix=<path> 指定Nginx软件的安装路径,若不指定默认安装在/usr ...
- hive自定义udaf函数
自定义udaf函数的代码框架 //首先继承一个类AbstractGenericUDAFResolver,然后实现里面的getevaluate方法 public GenericUDAFEvaluator ...
- centos7安装activemq5.15
1. 官网下载 http://activemq.apache.org/components/classic/download/ 上传到服务器 2. 安装 tar zxf apache-activemq ...
- PYQT5 pyinstaller 打包工程
win+R 输入cmd 回车 首先安装 pyinstaller : pip install pyinstaller 安装 pywin32: pip install pywin32 在cmd中输入工程 ...
- katalon设置Android SDK路径
本文链接:https://blog.csdn.net/feiniao8651/article/details/82809147文章允许转载,请注明来源:https://blog.csdn.net/fe ...
- 帝国cms 获取一条数据,但是从第二条开始获取
/*这里的1指的是获取一条数据,2指的是从第二条开始获取*/ [e:loop={"select * from phome_ecms_news where classid='2' limit ...
- Linux和Windows双系统下Windows系统插入耳机没有声音
我的笔记本装了Windows7和Debian双系统后,在Windows7下,插入耳机竟然没有声音. 按常规思路分析:首先考虑是耳机问题还是笔记本电脑问题.确定耳机没问题后问题就在笔记本身上了.而问题在 ...
- mac系统下Eclipse + pydev配置python Interpreter
mac系统下Eclipse + pydev配置python Interpreter 之前都在windows下使用Eclipse + pydev 进行开发,未发现什么异常,最近对wxpy.itcha ...