题目描述

在平面上有nn个点(n \le 50n≤50),每个点用一对整数坐标表示。例如:当 n=4n=4 时,44个点的坐标分另为:p_1p1​(1,11,1),p_2p2​(2,22,2),p_3p3​(3,63,6),P_4P4​(0,70,7),见图一。

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

输入输出格式

输入格式:

n knk
x_1 y_1x1​y1​
x_2 y_2x2​y2​
... ...

x_n y_nxn​yn​ (0 \le x_i,y_i \le 5000≤xi​,yi​≤500)

输出格式:

输出至屏幕。格式为:

11个整数,即满足条件的最小的矩形面积之和。

输入输出样例

输入样例#1: 复制

  1. 4 2
  2. 1 1
  3. 2 2
  4. 3 6
  5. 0 7
输出样例#1: 复制

  1. 4
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. int x[],y[];
  7. int n,k,val,ans=0x7f7f7f7f;
  8. struct nond{
  9. int l,r,u,d;
  10. bool flag;
  11. }v[];
  12. int read(){
  13. int x=,f=;char ch=getchar();
  14. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  15. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  16. return x*f;
  17. }
  18. bool jud(int i,int j){
  19. if(v[i].l<=v[j].l&&v[i].r>=v[j].l&&v[i].d>=v[j].d&&v[i].u<=v[j].d) return true;
  20. if(v[i].l<=v[j].r&&v[i].r>=v[j].r&&v[i].d>=v[j].d&&v[i].u<=v[j].d) return true;
  21. if(v[i].l<=v[j].l&&v[i].r>=v[j].l&&v[i].d>=v[j].u&&v[i].u<=v[j].u) return true;
  22. if(v[i].l<=v[j].r&&v[i].r>=v[j].r&&v[i].d>=v[j].u&&v[i].u<=v[j].u) return true;
  23. return false;
  24. }
  25. bool judge(){
  26. for(int i=;i<=k;i++)
  27. if(v[i].flag)
  28. for(int j=;j<i;j++)
  29. if(v[j].flag)
  30. if(jud(i,j)) return true;
  31. return false;
  32. }
  33. void dfs(int now){
  34. if(judge()) return ;
  35. val=;
  36. for(int i=;i<=k;i++)
  37. if(v[i].flag)
  38. val+=(v[i].r-v[i].l)*(v[i].d-v[i].u);
  39. if(val>ans) return ;
  40. if(now==n+){
  41. ans=val;
  42. return ;
  43. }
  44. for(int i=;i<=k;i++)
  45. if(!v[i].flag){
  46. v[i].l=y[now];v[i].r=y[now];
  47. v[i].u=x[now];v[i].d=x[now];
  48. v[i].flag=;
  49. dfs(now+);
  50. v[i].flag=;
  51. }
  52. else if(v[i].flag){
  53. int a=v[i].l,b=v[i].r,c=v[i].u,d=v[i].d;
  54. v[i].l=min(v[i].l,y[now]);
  55. v[i].r=max(v[i].r,y[now]);
  56. v[i].u=min(v[i].u,x[now]);
  57. v[i].d=max(v[i].d,x[now]);
  58. dfs(now+);
  59. v[i].l=a;v[i].r=b;
  60. v[i].u=c;v[i].d=d;
  61. }
  62. }
  63. int main(){
  64. n=read();k=read();
  65. for(int i=;i<=n;i++)
  66. scanf("%d%d",&x[i],&y[i]);
  67. dfs();
  68. cout<<ans;
  69. }
  1.  

洛谷 P1034 矩形覆盖的更多相关文章

  1. 洛谷P1034 矩形覆盖

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

  2. 洛谷 - P1034 - 矩形覆盖 - dfs

    https://www.luogu.org/problemnew/show/P1034 可能是数据太水了瞎搞都可以过. 判断两个平行于坐标轴的矩形相交(含顶点与边相交)的代码一并附上. 记得这里的xy ...

  3. [NOIP2002] 提高组 洛谷P1034 矩形覆盖

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

  4. 洛谷——P1034 矩形覆盖

    https://www.luogu.org/problem/show?pid=1034 题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的 ...

  5. 洛谷 P2218 [HAOI2007]覆盖问题 解题报告

    P2218 [HAOI2007]覆盖问题 题目描述 某人在山上种了\(N\)棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他 ...

  6. P1034 矩形覆盖

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

  7. 洛谷 P1191 矩形 题解

    P1191 矩形 题目描述 给出一个 \(n \times n\)的矩阵,矩阵中,有些格子被染成白色,有些格子被染成黑色,现要求矩阵中白色矩形的数量 输入格式 第一行,一个整数\(n\),表示矩形的大 ...

  8. 洛谷——P2082 区间覆盖(加强版)

    P2082 区间覆盖(加强版) 题目描述 已知有N个区间,每个区间的范围是[si,ti],请求出区间覆盖后的总长. 输入输出格式 输入格式: N s1 t1 s2 t2 …… sn tn 输出格式: ...

  9. 洛谷 P1324 矩形分割

    P1324 矩形分割 题目描述 出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块. 对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切 ...

随机推荐

  1. shell脚本,实现奇数行等于偶数行。

    请把如下字符串stu494e222fstu495bedf3stu49692236stu49749b91转为如下形式:stu494=e222fstu495=bedf3stu496=92236stu497 ...

  2. 二. python函数与模块

    第四章.内置函数与装饰器详解 1.内置函数补充1 注:红色圆圈:必会:  紫红色方框:熟练:   绿色:了解 callable() 判断函数是否可以被调用执行 def f1(): pass f1() ...

  3. 分享读C Primer Plus时遇到的一个问题(补档5月7日)

    最近在学习C Primer Plus.书中第66页,3.8 关键概念 这一小节中有这一段话: “计算机中的浮点数和整数在本质上不同,其存储方式和运算过程有很大区别.即使两个 32 位存储单元存储的位组 ...

  4. PAT Basic 1024

    1024 科学计数法 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1 ...

  5. progit 学习笔记-- 1 第一章 第二章

    * 1 起步**  关于版本控制*** 什么是版本控制?记录文件变化,查阅特定版本,回溯到之前的状态.任何类型的文件进行版本控制.复制整个目录 加上备份时间 简单 混淆 无法恢复本地版本控制 数据库记 ...

  6. UVa 10534 DP LIS Wavio Sequence

    两边算一下LIS就出来了,因为数据比较大,所以需要二分优化一下. #include <iostream> #include <cstdio> #include <cstr ...

  7. Java-字符串大小写转换

    package com.tj; public class MyClass implements Cloneable { public static void main(String[] args) { ...

  8. 图论trainning-part-1 G. Stockbroker Grapevine

    G. Stockbroker Grapevine Time Limit: 1000ms Memory Limit: 10000KB 64-bit integer IO format: %lld     ...

  9. GDB使用例子

    GDB使用例子 一般来说GDB主要调试的是C/C++的程序.要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中.使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点. ...

  10. HDU 4417 Super Mario(划分树问题求不大于k的数有多少)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...