矩形覆盖题解
- 格式:doc
- 大小:112.00 KB
- 文档页数:28
NOIP 2011 提高组day1 题解美少女战士原创1.铺地毯(carpet.cpp/c/pas)【问题描述】为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。
一共有n 张地毯,编号从1 到n。
现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。
地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。
注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。
【输入】输入文件名为 carpet.in。
输入共 n+2 行。
第一行,一个整数 n,表示总共有n 张地毯。
接下来的 n 行中,第i+1 行表示编号i 的地毯的信息,包含四个正整数a,b,g,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯在x轴和y 轴方向的长度。
第 n+2 行包含两个正整数x 和y,表示所求的地面的点的坐标(x,y)。
【输出】输出文件名为 carpet.out。
输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1。
【输入输出样例 1】carpet.in carpet.out3 31 02 30 2 3 32 13 32 2【输入输出样例说明】如下图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,覆盖点(2,2)的最上面一张地毯是3 号地毯。
【输入输出样例 2】carpet.in carpet.out3 -11 02 30 2 3 32 13 34 5【输入输出样例说明】如上图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,点(4,5)没有被地毯覆盖,所以输出-1。
(不好意思,因为是从PDF中复制过来的,所以没有图,不过挺简单的,大家可以自己做一下)(嘿嘿,还是我的朋友智慧,我怎么就没想到用QQ截图)【数据范围】对于 30%的数据,有n≤2;对于 50%的数据,0≤a, b, g, k≤100;对于 100%的数据,有0≤n≤10,000,0≤a, b, g, k≤100,000。
矩形的面积与周长之练习题计算矩形的面积和周长矩形是我们数学中常见的平面图形,具有独特的性质,面积和周长是矩形的两个重要指标。
在这篇文章中,我们将介绍如何计算矩形的面积和周长,并给出一些练习题来巩固所学知识。
一、矩形的面积计算公式矩形的面积是指矩形所覆盖的平面区域大小。
我们可以通过计算矩形的长度和宽度的乘积来求得矩形的面积。
具体而言,如果矩形的长度为l,宽度为w,那么矩形的面积可以表示为A = l * w。
例如,假设一个矩形的长度为5cm,宽度为3cm,我们可以使用上述公式计算出该矩形的面积:A = 5cm * 3cm = 15cm²因此,该矩形的面积为15平方厘米。
二、矩形的周长计算公式矩形的周长是指矩形的边界长度。
常见的矩形具有两对相等的边,即相对的两条边长度相等。
因此,我们可以通过计算矩形的长度和宽度的两倍之和来求得矩形的周长。
具体而言,如果矩形的长度为l,宽度为w,那么矩形的周长可以表示为P = 2l + 2w。
例如,假设一个矩形的长度为5cm,宽度为3cm,我们可以使用上述公式计算出该矩形的周长:P = 2 * 5cm + 2 * 3cm = 16cm因此,该矩形的周长为16厘米。
三、练习题为了巩固所学的面积和周长计算方法,我们来解决一些矩形练习题。
1. 若一个矩形的面积为20平方米,其长度为4米,求该矩形的宽度和周长。
解答:由面积的计算公式可知,面积A = l * w。
已知面积为20平方米,长度l为4米,代入公式可得:20 = 4 * w解得:w = 5宽度为5米。
由周长的计算公式可知,周长P = 2l + 2w。
已知长度l为4米,宽度w为5米,代入公式可得:P = 2 * 4 + 2 * 5解得:P = 18该矩形的宽度为5米,周长为18米。
2. 若一个矩形的周长为30厘米,其宽度为3厘米,求该矩形的长度和面积。
解答:由周长的计算公式可知,周长P = 2l + 2w。
已知周长为30厘米,宽度w为3厘米,代入公式可得:30 = 2l + 2 * 3解得:2l = 24,l = 12长度为12厘米。
多个矩形覆盖问题算法一、问题描述多个矩形覆盖问题是一种常见的计算机科学问题,涉及到对一组矩形区域的优化覆盖。
具体来说,给定一组矩形区域,我们需要找到一种最优的覆盖方式,使得覆盖的总面积最小。
这个问题在许多实际场景中都有应用,例如在计算机视觉、图形学、游戏开发等领域。
二、算法思路解决多个矩形覆盖问题的关键在于找到一种最优的覆盖策略,使得覆盖的总面积最小。
我们可以使用以下思路来解决这个问题:1. 空间划分:将问题分解为两个部分:搜索和空间划分。
搜索部分用于找到最优的矩形覆盖方案,空间划分部分则用于优化搜索效率。
2. 空间划分策略:根据矩形的形状和大小,采用不同的策略进行空间划分。
例如,可以使用网格划分法、层次遍历法等。
3. 搜索算法:采用启发式搜索算法,如深度优先搜索、A*搜索等,来寻找最优的矩形覆盖方案。
同时,可以利用剪枝函数等技巧来避免无效搜索,提高搜索效率。
4. 动态规划:在某些情况下,可以使用动态规划算法来优化搜索过程,避免重复计算,提高算法效率。
三、算法实现下面是一个基于深度优先搜索和剪枝函数的多个矩形覆盖问题的算法实现示例:1. 初始化:创建一个空的矩形集合,并设置一个最小值变量minArea为正无穷大。
2. 进入循环,直到所有矩形都被处理完毕:a. 对于每个待处理的矩形rect,进行以下操作:i. 计算当前矩形rect的面积area。
ii. 如果area小于当前最小值minArea,则将minArea更新为area,并将当前矩形rect添加到已处理矩形集合中。
iii. 使用深度优先搜索或A*搜索算法,寻找可以与当前矩形rect重叠的最小面积矩形(称为父矩形)。
iv. 如果父矩形rect已存在于已处理矩形集合中,则跳过此次搜索;否则,更新父矩形rect的位置和面积信息,并将其添加到已处理矩形集合中。
b. 返回minArea作为结果。
四、算法优化在实际应用中,可以通过以下方法对上述算法进行优化:1. 使用空间索引结构(如Kd树、B树等)来加速矩形之间的碰撞检测和重叠判断。
二次函数面积
二次函数的面积方法有很多种:铅垂高法、平行法、矩形覆盖法。
每个方法计算的方式方法是不同的,在学习和练习的时候,也要根据自己的实际情况进行学习。
方法一:铅垂高法
铅垂高的表示法是解这种题的关键。
可以结合写的简略过程,进行一下总结,而且还可以知识的迁移。
比如不问最大面积,而是问面积等于一个数,或者面积等于某三角形面积等类型,解法都是相同的。
方法二:平行法
平行法最关键的知识点,是平行线之间高的问题,一般这种情况都是平移高到与坐标轴交点处,最后用相似求值。
如果题目如下图,还涉及到二次函数与一次函数只有一个交点问题,解决方法是联立得到一元二次方程,根据只有一个交点,利用根的判别式等于0可以解决。
方法三:矩形覆盖法
这是最容易想到的方法,但也是计算最麻烦的方法。
利用面积的大减小去解决,一般不太建议使用这种方法,庞大的计
算量很容易出错。
移动通信基站网络覆盖问题摘要随着人均生活水平的不断提升,人们对于移动通信技术水平的要求也在不断提高,移动通信基站的覆盖问题也成了热点研究问题之一。
本文主要研究移动通信基站的覆盖问题,即可将其转化为由若干个圆形面积来无缝覆盖一个矩形面积的问题,题中采用大基站和小基站覆盖的方法,即用两种半径分别为1km和0.5km的圆形面积覆盖矩形面积。
而圆周为弧线,因此必存在重叠覆盖的区域,则将其转化为正多边形无重叠覆盖的问题。
按照我们对题目要求的理解,在优先满足使用基站费用最少的条件来覆盖整个矩形面积,然后在这个基础之上再来调整使得覆盖面积的浪费最少。
由此我们得出以下结论:(1)基站覆盖时,小基站覆盖面积为s=π*0.5^2,费用为1.1万元;大基站覆盖面积为S=π*1^2,费用为4万元,由此得出多使用大基站,空缺的地方再用小基站来补全的结论。
(2)为满足“覆盖该区域”这一条件,就需要圆形相接。
相接的圆形交点可以连成多边形,而这个多边形恰恰就是有效面积。
我们将圆覆盖矩形的问题转化为多边形覆盖矩形的问题。
而相比较之下,六边形的有效面积利用率最高,由此得出利用六边形模型来等效圆的结论。
(3)为达到覆盖优化的效果,我们将边界处的低利用大圆面积,用小基站来覆盖。
关键词:无线通信、六边形覆盖、利用率高、优化一、问题重述设某移动公司在建移动通信基站中,有一长200km,宽100km的矩形区域,需要建一基站覆盖该区域。
基站有两类:一类是大功率基站,一类是小功率基站,有效覆盖是半径分别为1km和0.5km的圆域,每建一个基站的费用分别为4万元和1.1万元。
问:(1)当所需区域为平面时请设计方案,使总费用最小;(2)设中心区域有一个小山,其海拔高度分布为(x^2+y^2<=1000000)x,y的单位为m,区域的其余部分是海拔为500m的平地,请设计一个建基站的方案,使总费用最小。
二、问题分析问题的目标是在于费用使用最少的情况下,尽可能多地全覆盖矩形面积。
[noip2002 提高组] 矩形覆盖讲解-回复矩形覆盖问题,是一个经典的递归问题,在算法竞赛中经常考察。
这个问题可以通过递归的方法来解决,也可以通过动态规划的方法来解决。
在本文中,我们将使用动态规划的方法来解决这个问题。
首先,让我们来定义这个问题。
给定一个宽度为m、高度为n的矩形,我们要找到一种方式用1x2的小矩形完全覆盖这个大矩形,每个小矩形可以竖直或水平放置。
换句话说,我们要找到一种方式将大矩形划分成尽可能多的1x2小矩形。
我们使用f(m,n)表示宽度为m、高度为n的矩形的覆盖方式数量。
那么我们可以根据问题的特性,得到递推关系式:f(m,n) = f(m-1,n) + f(m-2,n)。
其含义是,对于宽度为m、高度为n的矩形,最左边可以放一个1x2的小矩形,这时剩余的部分是一个宽度为m-1、高度为n的矩形,此时的覆盖方式数量为f(m-1,n);或者最左边可以放一个2x1的小矩形,这时剩余的部分是一个宽度为m-2、高度为n的矩形,此时的覆盖方式数量为f(m-2,n)。
因此,f(m,n)等于这两种情况的覆盖方式数量之和。
基于上述递推关系式,我们可以得到初始条件:f(1,1) = 1、f(2,1) = 1、f(1,2) = 1、f(2,2) = 2。
这是因为宽度或高度为1时,只有一种覆盖方式,而宽度和高度都为2时,有两种覆盖方式。
接下来,我们可以使用动态规划来求解这个问题。
我们可以用一个二维数组dp来存储每个子问题的解,其中dp[i][j]表示宽度为i、高度为j的矩形的覆盖方式数量。
我们可以根据递推关系式和初始条件来填充这个数组。
首先,我们可以将初始条件填充到dp数组中:dp[1][1] = 1dp[2][1] = 1dp[1][2] = 1dp[2][2] = 2然后,我们可以使用一个双重循环来遍历数组dp,从左上角开始一行一行地进行填充。
具体的填充过程如下:对于每个dp[i][j],我们可以通过dp[i-1][j]和dp[i-2][j]的值来计算。
区域覆盖问题摘要本论文主要是针对一个特定的矩形区域m*n(1000*1000)展开的,对该正方形区域进行分析,得知:要对矩形区域用圆进行覆盖即先需要对圆用多边形进行覆盖,由最小覆盖圆模型知,当且仅当用正多边形来限制圆的半径得到的圆可以使得覆盖整个图形时所用圆的个数最少。
本文先证明问题一:一定半径(范围要求)的圆的内接正多边形可以完全覆盖该矩形区域,那么若干个该正多边形的外接圆能使得完全覆盖整个矩形区域所用圆的个数最少;再证明问题二:满足问题一限制条件的正多边形有正三角形正四边形正六边形。
在适当的假设条件下,对假设的合理性进行说明和验证,得到了题目所求的最优值。
文中用到了几何知识、覆盖原理、微积分等一些数学知识探究了矩形覆盖的问题,通过计算机模拟分析了不同正多边形相交率变化趋势,最后运用matlab作出符合一般性的程序并得出相关图形。
1.问题重述该题目讨论的是在一个特定的矩形区域(1000*1000)中,用半径为R的圆对其进行完全覆盖,要求相邻两个圆相交的公共面积不小于一个圆面积的K%,则应该如何覆盖可使得完全覆盖整个图形时所用圆的个数最少?则问题有如下几个方面:1.探究并证明正多边形的外接圆比不规则的多边形的外接圆的覆盖率要大;2.在满足条件的正多边形的外接圆的个数最少;3.假设m=n=1000,r=100,则当k=5和k=18时,满足正多边的形状?4.由第3问的特殊情形探究一般情况并得到一般结论。
2.模型的假设与符号约定2.1模型假设:1.区域中所有用于覆盖的圆是半径相等的圆。
2.在区域中所有的地形是相对平整的,不考虑地形的影响。
3.在覆盖过程中不考虑圆周长,半径及圆心的宽度。
2.23 问题的分析3.1 圆的排列方式区域覆盖[]2是指对一个指定区域,用一系列称为一跳覆盖区的小区域(圆)将其有重叠地完全覆盖。
一个有效的区域覆盖策略应能达到如下要求:(1)尽可能使全部一跳覆盖区半径之和为最小,即用最少的圆覆盖整个区域,这样才能节省节点资源。
数学竞赛讲座之覆盖问题一个半径为1的单位圆显然是可以盖住一个半径为的圆的.反过来则不然,一个半径为的圆无法盖住单位圆.那么两个半径为的圆能否盖住呢?不妨动手实验一下,不行.为什么不行?需几个这样的小圆方能盖住大圆?……,这里我们讨论的就是覆盖问题,它是我们经常遇到的一类有趣而又困难的问题.定义设G和F是两个平面图形.如果图形F或由图形F经过有限次的平移、旋转、对称等变换扣得到的大小形状不变的图形F′上的每一点都在图形G上.我们就说图形G覆盖图形F;反之,如果图形F或F′上至少存在一点不在G上,我们就说图形G不能覆盖图形F.关于图形覆盖,下述性质是十分明显的:(1)图形G覆盖自身;(2)图形G覆盖图形E,图形E覆盖图形F,则图形G覆盖图形F.1.最简单情形――用一个圆覆盖一个图形.首先根据覆盖和圆的定义及性质即可得到:定理1如果能在图形F所在平面上找到一点O,使得图形F中的每一点与O的距离都不大于定长r,则F可被一半径为r的圆所覆盖.定理2对于二定点A、B及定角α若图形F中的每点都在AB同侧,且对A、B视角不小于α,则图形F被以AB为弦,对AB视角等于α的弓形G所覆盖.在用圆去覆盖图形的有关问题的研究中,上述二定理应用十分广泛.例1求证:(1)周长为2l的平行四边形能够被半径为的圆面所覆盖.(2)桌面上放有一丝线做成的线圈,它的周长是2l,不管线圈形状如何,都可以被个半径为的圆纸片所覆盖.分析(1)关键在于圆心位置,考虑到平行四边形是中心对称图形,可让覆盖圆圆心与平行四边形对角线交点叠合.(2)"曲"化"直".对比(1),应取均分线圈的二点连线段中点作为覆盖圆圆心.证明(1)如图45-1,设ABCD的周长为2l,BD≤AC,AC、BD交于O,P为周界上任意一点,不妨设在AB上,则∠1≤∠2≤∠3,有OP≤OA.又AC<AB+BC=l,故OA<.因此周长为2l的平行四边形ABCD可被以O为圆心;半径为的圆所覆盖,命题得证.(2)如图45-2,在线圈上分别取点R,Q,使R、Q将线圈分成等长两段,每段各长l.又设RQ中点为G,M为线圈耻任意一点,连MR、MQ,则因此,以G为圆心,长为半径的圆纸片可以覆盖住整个线圈.例2△ABC的最大边长是a,则这个三角形可被一半径为的圆所覆盖.分析a为最大边,所对角A满足60°≤A<180°.证明不妨设BC=a,以BC为弦,在A点所在一侧作含60°角的弓形弧(图45-3).因60°≤A≤180°,故根据定理2,△ABC可被该弓形所覆盖.由正弦定理,弓形相应半径r=,所以△ABC可被半径为的圆所覆盖.显然覆盖△ABC的圆有无穷多个,那么半径为的圆是否是最小的覆盖圆呢?事实并不尽然.例3△ABC的最大边BC等于a,试求出覆盖△ABC的最小圆.解分三种情形进行讨论:(1)∠A为钝角,以BC为直径作圆即可覆盖△ABC.(2)∠A是直角,同样以BC为直径作圆即可覆盖△ABC;(3)∠A是锐角.假若⊙O覆盖△ABC,我们可在⊙O内平移△ABC,使一个顶点B 落到圆周上,再经过适当旋转,使另一个顶点落在圆周上,此时第三个顶点A在⊙O内或其圆周上,设BC所对圆周角为α,那么∠BAC≥α,设⊙O直径d,△ABC外接圆直径d0,那么所以对于锐角三角形ABC,最小覆盖圆是它的外接圆.今后我们称覆盖图形F的圆中最小的一个为F的最小覆盖圆.最小覆盖圆的半径叫做图形F的覆盖半径.综合例2、例3,即知△ABC中,若a为最大边,则△ABC的覆盖半径r满足2.一个图形F能否被覆盖,与图形中任意两点间的距离最大值d密切相关.以下我们称图形F中任意两点间的距离最大值d为图形F的直径.我们继续研究多个圆覆盖一个图形问题.定义对于图形G1,G2,…,Gn,若图形F中的每一点都被这组图形中的某个所覆盖,则称这几个图形覆盖图形F.图形G1,G2,…,Gn为n个圆是一特殊情形.例4以ABCD的边为直径向平行四边形内作四个半圆,证明这四个半圆一定覆盖整个平行四边形.分析1ABCD的每一点至少被某个半圆所盖住.证明1用反证法.如图45-4设存在一点P在以AB、BC、CD、DA为直径的圆外,根据定理二,∠APB,∠BPC,∠CPD∠DPA均小于90°,从而∠APB+∠BPC+∠CPD+∠DPA<360°.与四角和应为周角相矛盾.故P应被其中一半圆盖住,即所作四个半圆覆盖ABCD.分析2划片包干,如图45-5,将ABCD分为若干部分,使每一部分分别都被上述四个半圆所覆盖.证明2在ABCD中,如图45-5,设AC≥BD.分别过B、D引垂线BE、DF垂直AC,交AC于E、F,将ABCD分成四个直角三角形,△ABE、△BCE、△CDF、△DAF.每一个直角三角形恰好被一半圆所覆盖,从而整个四边形被四个半圆所覆盖.上述结论可推广到任意四边形,留给读者考虑.例5求证:一个直径为1的圆不能被两个直径小于1的圆所覆盖.证明如图45-6,先考虑其中一个小圆即⊙O1去覆盖大圆O,连O1、O过O作AB⊥O1O,AB为⊙O的直径(若O1、O重合,那么AB为任意直径)此时故A、B两点都不能被⊙O1盖住.至于另一小圆⊙O2无疑不能同时盖住A、B两点,故⊙O1、⊙O2不能覆盖⊙O.事实上,我们还可以从另一角度给予证明.那就是一个小圆无法覆盖半个大圆,因此两个小圆也就不可能覆盖住整个大圆了.现在,我们着手研究本文一开始就提出的问题.例6给定一个半径为1的圆,若用半径为的圆去覆盖它,问至少要几个才能盖住.问题需要我们在二个方面给予回答:一是所确定数目的小圆足以覆盖大圆;二是少于确定的数目,则全部小圆不能覆盖大圆.对于不能覆盖的推断,以下两个原则是常用的:原则1若图形F的面积大于图形G的面积,则图形G不能覆盖图形F.原则2直径为d的图形F不能被直径小于d的图形G所覆盖.两原则十分显然,不再证明.四个半径为的小圆面积和为π,恰等于大圆面积,而四小圆间若不重迭,则覆盖其它图形时,还须排除中间所夹的不属于四圆的部分,换句话说,四小圆所覆盖大圆部分面积必小于大圆自身面积,根据法则1,不可能覆盖大圆,少于四个小圆更不可能.若有五个小圆,我们改变角度考虑,可将大圆周分为六等分.因小圆直径为1,五个小圆无法盖住大圆周,而六个圆周恰好盖住.还需考虑大圆圆心没有被盖住,再添加一个小圆,符合要求!这说明:至少七个以为半径的小圆方能覆覆盖半径为1的一个大圆.事实上这样的六个小圆若盖住大圆周,则大圆心不能被覆盖.若其中一小圆盖住大圆圆心,那么该圆又至多盖住大圆周上一点也就是六个小圆无法覆盖大圆,而我们作大圆的内接正六边形,分别将小圆圆心与各边中点重合,再将第七个小圆圆心与大圆圆心重合即可盖住大圆,如图45-7,以下给出证明:对于正△OAB,设OA、OB中点A1、B1,那么∠AA1B=∠AB1B=90°,故四边形AA1B1B被以AB为直径的圆覆盖.另外,△OA1B1被小圆⊙O所覆盖.类似地可推得七个小圆覆盖整个大圆.3.直线形图形覆盖别的图形的问题解决直线形图形覆盖别的图形的问题,常须较高的智巧,一般的处理方法是通过构造过渡图形,逐步调整,最终获得问题的解决.例7证明直径为1的图形F可被单位正方形覆盖.分析先后用互相垂直的两对平行线将图形夹在中间,再向内收缩.证明取位于水平方向和铅直方向的两对平行直线将图形F夹在中间,再将位于下方的直线l2向上平移,直至遇到图形F上点为止,中图45-8中l2′处.接着又将l1向下平移至与l2′相距为1的l1′处止.因图形F直径为1.故图形F仍被二直线l1′,l2′所夹.同样采用先左后右的顺序,将沿直线m1、m2平移至m1′、m2′处,m1′、m2′相距为1,而图形F依然夹在直线m1′,m2′中间,从而直线l1′、l2′、m1′、m2′所围成单位正方形即可覆盖图形F.运用上述方法,我们可进一步解决以下问题:例8直径为1的图形F可被一个边长为的正三角形覆盖,试证明之.证明作三对相距为1的平行直线m1、m2、n1、n2,l1、l2,相交直线所成角为60°,围成可覆盖图形F的六边形及正△A1B1C1,正△A2B2C2(具体作法可参照例7).如图45-9.设P为F中任意一点,它到六边形各边距离依次为x、a、y、b、z、c.又设正△A1B1C1的高为h1,正△A2B2C2的高为h2.因正三角形内一点到三边距离和等于正三角形的高,得a+b+c=h1,x+y+z=h2.相加,得(x+b)+(y+c)+(z+a)=h1+h2,又x+b=1,y+c=1,z+a=1,∴h1+h2=3.根据抽屉原则,h1、h2中有一不大于,不妨设,即正△A1B1C1的高不大于,那么它的边长因此图形F可被边长不大于的正三角形即正△A1B1C1所覆盖.4.图形的嵌入是覆盖问题的一种重要变化形式所谓图形F能嵌入图形G,其本质就是图形G能覆盖图形F.例9试证面积为S、周长为P的四边形一定可嵌入一个半径为的圆.分析四边形内存在到各边距离不小于的点.证明如图45-10,设四边形ABCD面积为S,周长为P.各边长分别为a1、a2、a3、a4.现以a1、a2、a3、a4为长,为宽,向四边形内侧作矩形,则这些矩形总面积是即四个矩形面积总和等于四边形面积.由于这四个矩形有重迭部分,所以四边形内部存在点O没有被矩形覆盖,那么以点O为圆心,为半径的圆可嵌入四边形ABCD中.例10 在一个半径等于18的圆中已嵌入16个半径为3的圆.证明在余下的部分中还能嵌入9个半径为1的圆.证明首先证明大圆中还能嵌入1个半径为1的小圆.先将大圆的半径收缩为17,而将半径为3的圆膨胀成半径为4的圆,此时大圆面积变为π×172=289π.16个半径为4的圆的面积是π×42×16=256π.289π-256π=33π.这说明大圆中嵌入16个半径为3的圆外,还能嵌入半径为1的一个小圆,如图45-11所示.再将大圆的半径收缩为17,半径为3的圆的半径膨胀为4,半径为1的圆膨胀为2,由于289π-256π-4π=29π,所以大圆中除嵌入16个半径为3的圆外,还能嵌入两个半径为1的圆.依此类推,由于289π-256π-4π×8=π>0,故大圆还可嵌入九个半径为1的小圆.将图形收缩、膨胀是解嵌入问题一种重要方法.。
第四题矩形覆盖矩形覆盖(存盘名NOIPG4)[问题描述]:在平面上有 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 kxl y1x2 y2... ...xn yn (0<=xi,yi<=500)[输出]:输出至屏幕。
格式为:一个整数,即满足条件的最小的矩形面积之和。
[输入输出样例]d.in :4 21 12 23 60 7屏幕显示:4分析【题解一】1、本题的难度较大。
如果你这样认为:即在假定已用i 个矩形(面积和满足最小)覆盖所有点的基础上,穷举所有2个矩形合并成1个矩形(条件是:在所有合并方案中使合并后面积最小),从而使矩形个数减少为i-1——那就错了,可是却可以通过前4组测试数据!正确的做法是对不同的K 值分别进行计算,好在K 值较小,否则...讨论:k=1,只要求出n 个点坐标的最大、最小值,就可求得矩形的位置与面积;k=2,有2个矩形,它们只有2种分布形式:左右式(flag=0),上下式(flag=1)对于左右式,显然要先将所有点按横坐标升序排列,可将点1~点i-1放入矩形1中,将点i~点n 放入矩形2中,求两矩形的面积之和;如果面积和比上一个值小,记下;让i 从2循环到n,就可完成左右式的全部搜索;对于上下式,先将所有点按纵坐标升序排列,依此类推。
k=3,有3个矩形,它们有6种分布形式:要用两重循环进行搜索:设i,j 为循环变量,将点1~i-1放入矩形1中,点i~j-1放入矩形2中,点j~n 放入矩形3中;点必须在放入前排好序(均为升序):对于flag=0,所有点按横坐标排序;对于flag=1,所有点按纵坐标排序;对于flag=2,所有点先按横坐标排序,然后点i~n 按纵坐标排序;对于flag=3,所有点先按横坐标排序,然后点1~j-1按纵坐标排序;对于flag=4,所有点先按纵坐标排序,然后点1~j-1按横坐标排序;对于flag=5,所有点先按纵坐标排序,然后点i~n 按横坐标排序;至于k=4,4个矩形有22种分布形式,实在太复杂!幸好测试数据中没有K=4的情形(似乎有意放了一马?)。
据说本题全国没有一人全对!(只要求K=1,2,3) 程序清单flag=0flag=1flag=2flag=3flag=4 flag=5flag=0flag=1{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S-,T-,V+,X+,Y+}{$M 65520,0,655360}program NOIPG4;const maxn=50;maxk=3;type rect=record{定义"矩形"数据类型}l,r,t,b:word;{矩形的左边,右边,下边,上边距坐标轴的距离}end;vxy=record{定义"点"数据类型}x,y:word;{点的横、纵坐标}end;var ju:array[1..maxk]of rect;v:array[1..maxn,0..2] of vxy;v0:vxy;n,k,i,j,ii,jj:byte;f:text;filename:string;Smin,temp:longint;function intersect(jui,juj:rect):boolean;{判断两矩形是否有公共点}var b1,b2,t1,t2,l1,l2,r1,r2:word;beginb1:=jui.b;b2:=juj.b;t1:=jui.t;t2:=juj.t;l1:=jui.l;l2:=juj.l;r1:=jui.r;r2:=juj.r;intersect:=((l2<=r1) and (l2>=l1) or (r2<=r1) and (r2>=l1) or (l2<=l1) and (r2>=r1)) and ((t2<=b1) and (t2>=t1) or (b2<=b1) and (b2>=t1)or (b2>=b1) and (t2<=t1));end;function area(ju:rect):longint;{求矩形的面积}var temp:longint;begintemp:=ju.b-ju.t;area:=temp*(ju.r-ju.l);{不能直接写成area:=(ju.b-ju.t)*(ju.r-ju.l);因为这样可能会溢出!}end;procedure insert(v:vxy;var ju:rect);{将点放入矩形}beginif v.x<ju.l then ju.l:=v.x;if v.x>ju.r then ju.r:=v.x;if v.y<ju.t then ju.t:=v.y;if v.y>ju.b then ju.b:=v.y;end;procedure init;{初始化}beginwrite('Input filename:');readln(filename);assign(f,filename);reset(f);readln(f,n,k);for i:=1 to n do beginread(f,v[i,0].x,v[i,0].y);v[i,1].x:=v[i,0].x;v[i,1].y:=v[i,0].y;end;for i:=1 to n-1 do{按横坐标升序排列各点,存入v[i,0]}for j:=i+1 to n doif v[i,0].x>v[j,0].x then beginv0:=v[i,0];v[i,0]:=v[j,0];v[j,0]:=v0;end;for i:=1 to n-1 do{按纵坐标升序排列各点,存入v[i,1]}for j:=i+1 to n doif v[i,1].y>v[j,1].y then beginv0:=v[i,1];v[i,1]:=v[j,1];v[j,1]:=v0;end;end;procedure solve;{核心计算}beginsmin:=maxlongint;case k of1:begin{K=1的情形}ju[1].b:=v[n,1].y;ju[1].t:=v[1,1].y;ju[1].r:=v[n,0].x;ju[1].l:=v[1,0].x;smin:=area(ju[1]);end;2:for jj:=0 to 1 do begin{K=2的情形}{flag=0,1的情形}ju[1].b:=v[1,jj].y;ju[1].t:=v[1,jj].y;ju[1].r:=v[1,jj].x;ju[1].l:=v[1,jj].x;for i:=2 to n do begininsert(v[i-1,jj],ju[1]);{将第i-1点放入矩形1}ju[2].b:=v[i,jj].y;ju[2].t:=v[i,jj].y;{将第i至n点放入矩形2}ju[2].r:=v[i,jj].x;ju[2].l:=v[i,jj].x;for ii:=i+1 to n do insert(v[ii,jj],ju[2]);if not intersect(ju[1],ju[2]) then begin{如果两矩形不交叉}temp:=0;for ii:=1 to k do temp:=temp+area(ju[ii]);if temp<smin then smin:=temp;end;end;end;3:beginfor jj:=0 to 1 do begin {flag=0,1的情形}ju[1].b:=v[1,jj].y;ju[1].t:=v[1,jj].y;ju[1].r:=v[1,jj].x;ju[1].l:=v[1,jj].x;for i:=2 to n-1 do begininsert(v[i-1,jj],ju[1]);ju[2].b:=v[i,jj].y;ju[2].t:=v[i,jj].y;ju[2].r:=v[i,jj].x;ju[2].l:=v[i,jj].x;if intersect(ju[1],ju[2]) then continue;for j:=i+1 to n do begininsert(v[j-1,jj],ju[2]);ju[3].b:=v[j,jj].y;ju[3].t:=v[j,jj].y;ju[3].r:=v[j,jj].x;ju[3].l:=v[j,jj].x;for ii:=j+1 to n do insert(v[ii,jj],ju[3]);if intersect(ju[2],ju[3]) then continue;temp:=0;for ii:=1 to k do temp:=temp+area(ju[ii]);if temp<smin then smin:=temp;end;end;end;{flag=2的情形:先竖直划分大矩形;再在右矩形中水平划分}ju[1].b:=v[1,0].y;ju[1].t:=v[1,0].y;ju[1].r:=v[1,0].x;ju[1].l:=v[1,0].x;for i:=2 to n-1 do beginfor ii:=1 to n do v[ii,2]:=v[ii,0];{所有点按横坐标升序排列,存入v[i,2]}for ii:=i to n-1 do{将点i至n按纵坐标升序排列,存入v[i,2]}for jj:=ii+1 to n doif v[ii,2].y>v[jj,2].y then beginv0:=v[ii,2];v[ii,2]:=v[jj,2];v[jj,2]:=v0;end;{结果:所有点先按横坐标升序排列,然后点i至n按纵坐标升序排列}insert(v[i-1,2],ju[1]);{将第i-1点放入矩形1}ju[2].b:=v[i,2].y;ju[2].t:=v[i,2].y;{将第i点放入矩形2}ju[2].r:=v[i,2].x;ju[2].l:=v[i,2].x;if intersect(ju[1],ju[2]) then continue;for j:=i+1 to n do begininsert(v[j-1,2],ju[2]);{将第j-1点放入矩形2}ju[3].b:=v[j,2].y;ju[3].t:=v[j,2].y;{将第j至n点放入矩形3}ju[3].r:=v[j,2].x;ju[3].l:=v[j,2].x;for ii:=j+1 to n do insert(v[ii,2],ju[3]);if intersect(ju[2],ju[3]) then continue;temp:=0;for ii:=1 to k do temp:=temp+area(ju[ii]);if temp<smin then smin:=temp;end;end;{flag=3的情形}for j:=3 to n do beginfor ii:=1 to n do v[ii,2]:=v[ii,0];for ii:=1 to j-2 dofor jj:=ii+1 to j-1 doif v[ii,2].y>v[jj,2].y then beginv0:=v[ii,2];v[ii,2]:=v[jj,2];v[jj,2]:=v0;end;ju[3].b:=v[j,2].y;ju[3].t:=v[j,2].y;ju[3].r:=v[j,2].x;ju[3].l:=v[j,2].x;for ii:=j+1 to n do insert(v[ii,2],ju[3]);for i:=2 to j-1 do beginju[2].b:=v[i,2].y;ju[2].t:=v[i,2].y;ju[2].r:=v[i,2].x;ju[2].l:=v[i,2].x;for ii:=i+1 to j-1 do insert(v[ii,2],ju[2]);ju[1].b:=v[1,2].y;ju[1].t:=v[1,2].y;ju[1].r:=v[1,2].x;ju[1].l:=v[1,2].x;for ii:=2 to i-1 do insert(v[ii,2],ju[1]);if intersect(ju[1],ju[2]) or intersect(ju[2],ju[3]) orintersect(ju[1],ju[3]) then continue;temp:=0;for ii:=1 to k do temp:=temp+area(ju[ii]);if temp<smin then smin:=temp;end;end;{flag=4的情形}for j:=3 to n do beginfor ii:=1 to n do v[ii,2]:=v[ii,1];for ii:=1 to j-2 dofor jj:=ii+1 to j-1 doif v[ii,2].x>v[jj,2].x then beginv0:=v[ii,2];v[ii,2]:=v[jj,2];v[jj,2]:=v0;end;ju[3].b:=v[j,2].y;ju[3].t:=v[j,2].y;ju[3].r:=v[j,2].x;ju[3].l:=v[j,2].x;for ii:=j+1 to n do insert(v[ii,2],ju[3]);for i:=2 to j-1 do beginju[2].b:=v[i,2].y;ju[2].t:=v[i,2].y;ju[2].r:=v[i,2].x;ju[2].l:=v[i,2].x;for ii:=i+1 to j-1 do insert(v[ii,2],ju[2]);ju[1].b:=v[1,2].y;ju[1].t:=v[1,2].y;ju[1].r:=v[1,2].x;ju[1].l:=v[1,2].x;for ii:=2 to i-1 do insert(v[ii,2],ju[1]);if intersect(ju[1],ju[2]) or intersect(ju[2],ju[3]) orintersect(ju[1],ju[3]) then continue;temp:=0;for ii:=1 to k do temp:=temp+area(ju[ii]);if temp<smin then smin:=temp;end;end;{flag=5的情形}ju[1].b:=v[1,1].y;ju[1].t:=v[1,1].y;ju[1].r:=v[1,1].x;ju[1].l:=v[1,1].x;for i:=2 to n-1 do beginfor ii:=1 to n do v[ii,2]:=v[ii,1];for ii:=i to n-1 dofor jj:=ii+1 to n doif v[ii,2].x>v[jj,2].x then beginv0:=v[ii,2];v[ii,2]:=v[jj,2];v[jj,2]:=v0;end;insert(v[i-1,2],ju[1]);ju[2].b:=v[i,2].y;ju[2].t:=v[i,2].y;ju[2].r:=v[i,2].x;ju[2].l:=v[i,2].x;if intersect(ju[1],ju[2]) then continue;for j:=i+1 to n do begininsert(v[j-1,2],ju[2]);ju[3].b:=v[j,2].y;ju[3].t:=v[j,2].y;ju[3].r:=v[j,2].x;ju[3].l:=v[j,2].x;for ii:=j+1 to n do insert(v[ii,2],ju[3]);if intersect(ju[2],ju[3]) then continue;temp:=0;for ii:=1 to k do temp:=temp+area(ju[ii]);if temp<smin then smin:=temp;end;end;end;end;end;begin{主程序}init;solve;writeln(smin);end.点评:压轴题据说,本次复赛主要是前三题的竞争,可见本题能得分的人相当少,但是K=1应该说是送分的,K=2也是比较容易的。