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函数 -- 作用域,异常处理
1.def语句和参数 python定义函数的关键词为def,格式如下: def 函数名([变元],[变元],....) #保存在变元中的值,在函数返回后该变元就会被销毁了. 2.返回 ...
- Java基础开篇
我是一个2019毕业的非计算机的毕业生,从大二开始喜欢上Java直到现在一直都在学习,Brid从小就对计算机感兴趣,可惜高中的时候不懂事,没有规划未来,考上了一所专科学院,然后大一并不能转专业,现在毕 ...
- const和static const的区别(未整理)
对于C/C++语言来讲,const就是只读的意思,只在声明中使用;static一般有2个作用,规定作用域和存储方式.对于局部变量,static规定其为静态存储方式,每次调用的初始值为上一次调用的值,调 ...
- Linux就该这么学——新手必须掌握的命令之我的第一个命令
1.Linux操作系统的开机进程(基本过程) (1).内核的引导: BIOS自检,安装BIOS默认设置的启动设备(硬盘)来启动.读取目录/boot目录下的内核文件 (2).运行init: 运行init ...
- Python 入门 之 初识面向对象
Python 入门 之 初识面向对象 1.初识面向对象编程 (核心--对象) (1)观察以下代码: # 面向过程编程 s = "alexdsb" count = 0 for i i ...
- Python-RabbitMQ-RPC(非阻塞版)
服务器端:rpc_server.py import pika,time connection = pika.BlockingConnection(pika.ConnectionParameters(h ...
- struts.xml中package标签的子标签及顺序
记录一下:
- render:h => h(App) ----render函数
转载其他博客1 new Vue({ 2 3 router, 4 store, 5 //components: { App } vue1.0的写法 6 render: h => h(App) vu ...
- Python爬虫之简单爬虫框架实现
简单爬虫框架实现 目录 框架流程 调度器url管理器 网页下载器 网页解析器 数据处理器 具体演示效果 框架流程 调度器 #导入模块 import Url_Manager import parser_ ...
- 什么是DDoS攻击?
本文转载自知道创宇云安全的知乎回答:DDoS 的肉鸡都是哪来的? 说到DDoS攻击,我们就不得不说“肉鸡”. “肉鸡”可谓是DDoS攻击的核心大杀器,作为一个要发起DDoS攻击的黑客来说,没有肉鸡就是 ...