矩形覆蓋題解

2022-12-01 03:15:02 字數 3790 閱讀 7165

第四題矩形覆蓋

矩形覆蓋(存檔名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 y1

x2 y2

xn yn (0<=xi,yi<=500)

[輸出]:

輸出至螢幕。格式為:

乙個整數,即滿足條件的最小的矩形面積之和。

[輸入輸出樣例]

: 4 2

1 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)

程式清單

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;

begin

b1:=

l1:=

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;

begin

temp:=

end;

procedure insert(v:vxy;var ju:rect);

begin

if < then

if > then

if < then

if > then

end;

procedure init;

begin

write('input filename:');readln(filename);

assign(f,filename);reset(f);readln(f,n,k);

for i:=1 to n do begin

read(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

for j:=i+1 to n do

if v[i,0].x>v[j,0].x then begin

v0:=v[i,0];v[i,0]:=v[j,0];v[j,0]:=v0;

end;

for i:=1 to n-1 do

for j:=i+1 to n do

if v[i,1].y>v[j,1].y then begin

v0:=v[i,1];v[i,1]:=v[j,1];v[j,1]:=v0;

end;

end;

procedure solve;

begin

smin:=maxlongint;

case k of

1:begin

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

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 begin

insert(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;

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 tempend;

end;

end;

3:begin

for jj:=0 to 1 do begin

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 begin

insert(v[i-1,jj],ju[1]);

ju[2].b:=v[i,jj].y;ju[2].t:=v[i,jj].y;

矩形菱形證明

矩形的定義與判定講義 學生 年級 初二教師 周金金科目 數學班主任 黃老師時間 一 知識回顧 1 平行四邊形的判定方法 2 矩形的性質 3 矩形的判定 典型例題 1 在矩形中,平分,過點作於,延長 交於點,下列結論中 正確的 abcd 1題2題3題 2 2014山東聊城,第9題,3分 如圖,在矩形a...

矩形經典例題

一 計算 1 已知矩形的對角線長為1,兩條相鄰邊之和為m,求矩形的面積 解析 依題設畫出示意圖,由矩形性質 又 由有 評述1 矩形作為特殊的平行四邊形其最特殊之處在於4個內角均為90 稍加鏈結,則會出現rt 借助勾股定理,矩形中只要知道一些條件 面積 邊長等皆可計算 評述2 此處兼顧考查了整式運算技...

矩形專項訓練

學校班級姓名座號 評分 1 如圖,矩形abcd中,ac與bd交於o點,於e,於f。求證 be cf。2 如圖所示,e為 abcd外,ae ce,be de,求證 abcd為矩形 3 如圖,矩形abcd的對角線相交於點o,of bc,ce bd,oe be 1 3,of 4,求 adb的度數和bd的長...