HNOI2007 最小矩形覆蓋

2022-05-10 23:35:45 字數 1931 閱讀 7862

給定一些點的座標,要求求能夠覆蓋所有點的最小面積的矩形,輸出所求矩形的面積和四個頂點座標

輸入格式:

第一行為乙個整數n(3<=n<=50000),從第2至第n+1行每行有兩個浮點數,表示乙個頂點的x和y座標,不用科學計數法

輸出格式:

第一行為乙個浮點數,表示所求矩形的面積(精確到小數點後5位),接下來4行每行表示乙個頂點座標,要求第一行為y座標最小的頂點,其後按逆時針輸出頂點座標.如果用相同y座標,先輸出最小x座標的頂點

輸入樣例#1:複製

6 

1.0 3.00000

1 4.00000

2.0000 1

3 0.0000

3.00000 6

6.0 3.0

輸出樣例#1:複製

18.00000

3.00000 0.00000

6.00000 3.00000

3.00000 6.00000

0.00000 3.00000

最小的覆蓋矩形肯定有邊在凸包上

先求出凸包,然後列舉凸包上的邊為直線構造矩形

用單調棧求出離該直線最遠的點,左邊最遠的點和右邊最遠的點

就可以算出矩形的四個點

有可能輸出-0.0000,所以要特判

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7 typedef long

double

ld;8

struct

point

9p[50005],s[50005

];12 point ansp[5

];13 ld eps=1e-10

,res,ans;

14int

n,top;

15ld cross(point a,point b)

1619 point operator *(point a,double

b)20;22

}23 point operator -(point a,point b)24;

26}27 point operator +(point a,point b)28;

30}31ld dot(point a,point b)

3235

ld dist(point a)

3639

intdcmp(ld x)

4045

bool

cmp(point a,point b)

4649

bool

cmp2(point a,point b)

5055

bool

c***(point a,point b)

5659

void

graham()

60 69}70

void

solve()

71 101

}102

}103

intmain()

104

111graham();

112solve();

113 printf("

%.5lf\n

",ans);

114 sort(ansp+1,ansp+5

,cmp);

115 sort(ansp+2,ansp+5

,c***);

116for (i=1;i<=4;i++)

117 printf("

%.5lf %.5lf\n

",ansp[i].x,ansp[i].y);

118 }

HNOI2007 最小矩形覆蓋

給定一些點的座標,要求求能夠覆蓋所有點的最小面積的矩形,輸出所求矩形的面積和四個頂點座標 輸入格式 第一行為乙個整數n 3 n 50000 從第2至第n 1行每行有兩個浮點數,表示乙個頂點的x和y座標,不用科學計數法 輸出格式 第一行為乙個浮點數,表示所求矩形的面積 精確到小數點後5位 接下來4行每...

HNOI2007 最小矩形覆蓋

給定一些點的座標,要求求能夠覆蓋所有點的最小面積的矩形,輸出所求矩形的面積和四個頂點座標 第一行為乙個整數n 3 n 50000 從第2至第n 1行每行有兩個浮點數,表示乙個頂點的x和y座標,不用科學計數法 第一行為乙個浮點數,表示所求矩形的面積 精確到小數點後5位 接下來4行每行表示乙個頂點座標,...

HNOI2007 最小矩形覆蓋

嘟嘟嘟 這道題我從昨天晚上5點做到今天下午3點半 差點就瘋了。真是一道計算幾何好題呀!剛開始我以為矩形與座標軸平行,感覺省選題竟然這麼水。但是看完樣例後發現我錯了 首先都知道要求凸包。寫 的時候一定要非常謹慎。對於重合或共線的點都要從棧中彈去,否則在後面的求矩形面積的時候會除以 0 然後就會想我一樣...