【NOIp2002】矩形覆盖
链接
数据范围很小,考虑搜索。
我最先想到的是枚举矩形,显然每个矩形的定点必然是输入中给出的点。
然而不仅复杂度不对,还贼难写。
冷静分析一下,不能枚举矩形包括哪个点,可以枚举点属于哪个矩形。
这样每个点有四种情况,复杂度O(n4),还有check的常数,可以说在TLE的边缘疯狂试探。
实际上,这么多情况是跑不满的,再加一些剪枝,就可以过了。
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<cstdlib> 6 using namespace std; 7 8 inline int read(){ 9 int x=0;char ch=getchar(); 10 while(ch<'0'||ch>'9')ch=getchar(); 11 while(ch>='0'&&ch<='9'){ 12 x=x*10+ch-'0';ch=getchar(); 13 } 14 return x; 15 } 16 17 const int N=55; 18 19 struct poi{ 20 int x,y; 21 }p[N]; 22 23 struct mtrx{ 24 int l,r,u,d; 25 bool fl; 26 }m[5]; 27 28 29 int n,k; 30 31 int ans=1e9+7; 32 33 inline bool ins(int a,int x,int y){ 34 if(x<=m[a].r&&x>=m[a].l&&y<=m[a].u&&y>=m[a].d)return true; 35 return false; 36 }//判断(x,y)是否在a矩形中 37 38 inline bool check(int a,int b){ 39 if(ins(a,m[b].l,m[b].u))return true; 40 if(ins(a,m[b].l,m[b].d))return true; 41 if(ins(a,m[b].r,m[b].u))return true; 42 if(ins(a,m[b].r,m[b].d))return true; 43 return false; 44 }//判断a,b矩形是否相交 45 46 inline void dfs(int now){ 47 int val=0; 48 for(int i=1;i<=k;++i){ 49 if(m[i].fl){ 50 for(int j=i+1;j<=k;++j){ 51 if(m[j].fl&&check(i,j))return ;//如果和另一个矩形相交 52 } 53 } 54 val+=(m[i].r-m[i].l)*(m[i].u-m[i].d); 55 }//先求一波当下的答案 56 if(val>ans)return; 57 if(now==n+1){ 58 ans=min(ans,val); 59 return; 60 } 61 for(int i=1;i<=k;++i){ 62 mtrx shep=m[i];//用于恢复状态 63 if(!m[i].fl){ 64 m[i].l=m[i].r=p[now].x; 65 m[i].u=m[i].d=p[now].y; 66 m[i].fl=1; 67 dfs(now+1); 68 m[i]=shep; 69 break; 70 }//这里break是因为,放到空矩形肯定比其他矩形不劣。 71 else{ 72 m[i].l=min(m[i].l,p[now].x); 73 m[i].r=max(m[i].r,p[now].x); 74 m[i].d=min(m[i].d,p[now].y); 75 m[i].u=max(m[i].u,p[now].y); 76 dfs(now+1); 77 m[i]=shep; 78 } 79 } 80 } 81 82 int main(){ 83 n=read();k=read(); 84 for(int i=1;i<=n;++i){ 85 p[i].x=read();p[i].y=read(); 86 } 87 dfs(1); 88 cout<<ans; 89 }
转载于:https://www.cnblogs.com/chiyo/p/11230978.html
【NOIp2002】矩形覆盖相关推荐
- [NOIP2002]矩形覆盖
在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这些点可以用 ...
- 递归和循环:跳台阶和变态跳台阶和矩形覆盖
题目描述 跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 变态跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级--它 ...
- 剑指offer_第10题_矩形覆盖
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形. 请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 理解 n个2*1的小矩形 覆盖 2*n的大矩形 覆盖方式: ...
- 7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------剑指offer系列
题目:斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). f(n) = f(n-1) + f(n-2) 基本思路 这道题在剑指offe ...
- BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 1435 Solv ...
- hdu5251最小矩形覆盖
题意(中问题直接粘吧) 矩形面积 Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些矩形包围起来的面积最小的矩形的面积是多少. Input 第 ...
- 洛谷 P1034 矩形覆盖
P1034 矩形覆盖 题目描述 在平面上有nn个点(n \le 50n≤50),每个点用一对整数坐标表示.例如:当 n=4n=4 时,44个点的坐标分另为:p_1p1(1,11,1),p_2p2( ...
- 剑指Offer #10 矩形覆盖(问题分析)
题目来源:牛客网-剑指Offer专题 题目地址:矩形覆盖 题目描述 我们可以用2∗12*12∗1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2∗12*12∗1的小矩形无重叠地覆盖一个2∗n2*n2 ...
- 算法练习day20——190411(重建二叉树、斐波那契数列、跳台阶、矩形覆盖、变态跳台阶、旋转数组的最小数字、矩阵中的路径)
1.重建二叉树 根据二叉树的前序遍历和中序遍历的结果,重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. preorder = [3,9,20,15,7].inorder = [9 ...
- 求点被多少个矩形覆盖
有很多矩形,矩形可能会重叠,又有很多点分散在平面上,求每一个点被多少个矩形覆盖? 方法1: 参考:http://dongxicheng.org/structure/segment-tree/ 总体思想 ...
最新文章
- FCN网络的训练——以燃气表数字识别为例
- python如何实现别人调用自己的API
- Cors 跨域Access-Control-Allow-Origin
- Visual Studio常用快捷键(非常实用)
- source insight 支持lua /ruby
- 初次联系导师短信模板_2020考研复试:提前联系导师的6点注意事项(附邮件模板)...
- 三星gtn8010安卓7_三星Galaxy Note 10.1 N8010 最后的救赎 Andorid 5.0.2 ROM
- 数据结构上机实验之二分查找
- FullCalendar 二:FullCalendar日历插件说明文档
- Debugging with GDB (6) gdb 命令
- 需求迭代:迭代需求矩阵
- 2018谷歌学术影响因子发布:NIPS首次跃进Top 100,CVPR排名泛AI领域第一
- CF915E Physical Education Lessons(珂朵莉树)
- 质量标准、质量策略和质量责任的概念解释
- 计算机在现代设计技术中应用,计算机技术在现代建筑设计中的应用
- 无线通信原理之OFDM技术
- 简单记录如何通过 VS Code 和 Auto Build Marlin编译和更新marlin固件
- Last chance to join 500+ others in Australia
- 天网系统服务器码,天网管理系统
- SyncToy同步工具安装使用详解