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]最小矩形覆盖 这计算几何……果然很烦…… 发现自己不会旋转卡壳,补了下,然后发现求凸包也不会…… 凸包:找一个最左下的点,其他点按照与它连边的夹角排序,然后维护一个栈用 ...
随机推荐
- python 学习笔记三 (元编程)
#动态创建类 # type(class_name, tuple_of_parent_class, dict_of_attribute_names_and_values), 第二个参数为继承关系,可以为 ...
- 批量删除Maven本地仓库中未下载完成的jar包(不完整的jar包)
1.删除repository库目录下所有后缀名是.lastUpdated的文件 2.进入maven本地仓库地址: CMD进入windows的路径(或在仓库目录的地址栏直接输入CMD,回车自动打开); ...
- hello1的web.xml解析
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1" ...
- python之函数、面向对象
学习python到了函数这一块进度有所放缓,主要还是想理解透彻,毕竟直觉告诉我函数是python是其中的关键,不管是模块.还是包.或者是库,都是建立在若干个函数定义上面. 章节后面就是关于面向对象编程 ...
- JS语法学习笔记-菜鸟教程
现在只需要<script></script>标签 javascript通常做法是放在<head>部分中,或者放在页面底部,这样可以把他们安置在同一位置,不会干扰页面 ...
- N1试卷常考词汇总结
免れる まぬがれる 免去,幸免 軽率 けいそつ 轻率,草率 捩れる ねじれる 拧劲儿,扭歪,弯曲 裂ける さける 裂开,破裂 避ける さける 躲避,避开 つまむ 挟,捏,掐 追及 ついきゅう 追上.追 ...
- Go语言的基本语法(二)
一·if -else (1) package main import "fmt" // if - else //func main(){ // // 先定义 一个变量 // v ...
- Spark写入HBase(Bulk方式)
在使用Spark时经常需要把数据落入HBase中,如果使用普通的Java API,写入会速度很慢.还好Spark提供了Bulk写入方式的接口.那么Bulk写入与普通写入相比有什么优势呢? BulkLo ...
- SAP中MM模块基础数据之Quota Arrangement(配额协议)的解析
有的时候我们的采购部门有这样的需求, 同一颗物料有几个供应商同时供料, 这个时候就涉及到一个问题, 避免出现总是和一家供应商购买物料的情况,我们需求把这些物料按照一定的比列分配给供应商.在SAP系统中 ...
- zabbix 性能优化
Zabbix 安装好就放在那不管了,以为不需要调优.直到最近出现了如下一堆告警. 描述下我们的环境 硬件:8核 32G 软件:Centos7.6 Zabbix4.0.Httpd2.4.PHP7.3.M ...