当前位置: 首页 > news >正文

P1034 [NOIP 2002 提高组] 矩形覆盖

题目描述

在平面上有 n 个点,每个点用一对整数坐标表示。例如:当 n=4 时,4 个点的坐标分别为:p1​(1,1),p2​(2,2),p3​(3,6),p4​(0,7),见图一。

这些点可以用 k 个矩形全部覆盖,矩形的边平行于坐标轴。当 k=2 时,可用如图二的两个矩形 s1​,s2​ 覆盖,s1​,s2​ 面积和为 4。问题是当 n 个点坐标和 k 给出后,怎样才能使得覆盖所有点的 k 个矩形的面积之和为最小呢?
约定:覆盖一个点的矩形面积为 0;覆盖平行于坐标轴直线上点的矩形面积也为 0。各个矩形必须完全分开(边线与顶点也都不能重合)。

输入格式

第一行共两个整数 n,k,含义如题面所示。

接下来 n 行,其中第 i+1 行有两个整数 xi​,yi​,表示平面上第 i 个点的坐标。

输出格式

共一行一个整数,为满足条件的最小的矩形面积之和。

输入输出样例

输入 #1

4 2
1 1
2 2
3 6
0 7

输出 #1

4

说明/提示

对于 100% 数据,满足 1≤n≤50,1≤k≤4,0≤xi​,yi​≤500。

【题目来源】

NOIP 2002 提高组第四题

 利用两次排序,分别以x,y来排序,每一个点可以分别和它的下面,左面进行dp,寻求最佳答案(上面和右面可以通过后面的点来比较),最后求最小值即可。

参考代码:

#include<bits/stdc++.h>
#define int long long
int const N=55;
using namespace std;
int num[N][N],dp[N][8],n,k;
struct node{
	int x,y;
	bool friend operator <(node aa,node bb)
	{
		if(aa.x!=bb.x)
		return aa.x<bb.x;
		else return aa.y<bb.y;
	}
	bool friend operator >(node aa,node bb)
	{
		if(aa.y!=bb.y)
		return aa.y<bb.y;
		else return aa.x<bb.x;
	}
}w[N];
bool cmp(node a,node b)
{
	return a<b;
}
bool cmp1(node a,node b)
{
	return a>b;
}
int chang(int l,int r)
{
	int minx=0x7fffffff,miny=0x7fffffff,maxx=0,maxy=0;
	for(int i=l;i<=r;i++)
	{
		minx=min(minx,w[i].x);
		miny=min(miny,w[i].y);
		maxy=max(maxy,w[i].y);
		maxx=max(maxx,w[i].x);
	}
	return (maxx-minx)*(maxy-miny);
}
void yu()
{
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++)
			num[i][j]=chang(i,j);
}
int qiu()
{
	yu();
	dp[1][1]=0;
	for(int i=2;i<=n;i++)
	{
		dp[i][1]=num[1][i];
		for(int r=2;r<=k;r++)
			for(int j=2;j<i;j++)
				dp[i][r]=min(dp[i][r],dp[j][r-1]+num[j+1][i]);
	}
	return dp[n][k];
}
signed main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>k;
	int maxx=0x7fffffff;
	for(int i=1;i<=n;i++)
		cin>>w[i].x>>w[i].y;
	memset(dp,0x3f,sizeof(dp));
	sort(w+1,w+1+n,cmp);
	maxx=min(maxx,qiu());
	memset(dp,0x3f,sizeof(dp));
	sort(w+1,w+1+n,cmp1);
	maxx=min(maxx,qiu());
	cout<<maxx;
	return 0;
} 

相关文章:

  • DeepSeek人工智能大模型全解析:技术架构与应用场景解读
  • go 模块管理
  • react+typescript,初始化与项目配置
  • UE4 GamePlay架构介绍
  • Springboot的jak安装与配置教程
  • 【C语言】结构体内存对齐问题
  • LeetCode 热题 100 49. 字母异位词分组
  • ✨ 索引有哪些缺点以及具体有哪些索引类型
  • Redis-AOF
  • go 反射 interface{} 判断类型 获取值 设置值 指针才可以设置值
  • 字符型验证码自动识别与填充提交——OCR浏览器插件的完整实现
  • 计算机视觉之图像处理-----SIFT、SURF、FAST、ORB 特征提取算法深度解析
  • 基于Python CNN和词向量的句子相似性度量
  • Python新春烟花
  • 【C# 数据结构】队列 FIFO
  • SpringBoot3中跨域问题解决
  • 上帝之眼——nmap
  • AI 人工智能 概念
  • 请解释 Vue 中的生命周期钩子,不同阶段触发的钩子函数及其用途是什么?
  • NetLogon 权限提升漏洞
  • 海运港口股掀涨停潮!回应关税下调利好,有货代称美线舱位爆了
  • 沙县小吃中东首店在沙特首都利雅得开业,首天营业额5万元
  • 俄土外长通话讨论俄乌谈判问题
  • 最高降价三成,苹果中国iPhone开启大促销,能拉动多少销量?
  • 扶桑谈|从石破茂“越菲行”看日本周边外交布局战略新动向
  • 商务部新闻发言人就中美日内瓦经贸会谈联合声明发表谈话