BZOJ1185 HNOI2007 最小矩形覆蓋

2021-08-18 18:28:32 字數 1632 閱讀 5581

題目描述

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

輸入輸出格式

輸入格式:

第一行為乙個整數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

題解結論:這個矩形的一條邊一定與凸包的一條邊重合。  

我們只需要以一條邊為基準,用另外3條邊去「卡」凸包即可,只需要通過叉積最大找對面的點,用點積最大找最右側的點,點積最小找最左的點,以這四個點作為與矩形相切的點去更新矩形面積,四個頂點即可。另外,在更新的時候以逆時針順序儲存點,這樣就可以方便的輸出。

**

#include

#define db double

using

namespace

std;

const

int m=5e4+5;

const db eps=1e-8;

struct pt;

int sig(db x)

pt operator -(pt a,pt b);}

pt operator +(pt a,pt b);}

db operator *(pt a,pt b)

db operator /(pt a,pt b)

pt operator *(pt a,db b);}

pt operator /(pt a,db b);}

bool

operator

<(pt a,pt b)

db shad(pt a,pt b,pt c)

db sqr(db x)

db dis(pt a,pt b)

bool cmp(pt a,pt b)

void tubao()

int k=top;

for(int i=n-1;i>=1;--i)

}int x[m];

db ****(db x)

void ac()

}ans=fabs(ans);

printf("%.5lf\n",ans);

int fir=0;

for(int i=1;i<=3;++i)

if(rec[i]for(int i=0;i<=3;++i)

printf("%.5lf %.5lf\n",****(rec[(i+fir)%4].x),****(rec[(i+fir)%4].y));

}int main()

bzoj1185 HNOI2007 最小矩形覆蓋

time limit 10 sec memory limit 162 mbsec special judge submit 1945 solved 853 submit status discuss 分析 有乙個比較顯然的結論 最小的矩形一定有一條邊在凸包上.利用旋轉卡殼求出對應邊的最遠點.這兩個是...

Bzoj1185 HNOI2007 最小矩形覆蓋

time limit 10 sec memory limit 162 mbsec special judge submit 1653 solved 745 submit status discuss 計算幾何 vfleaking提供spj 數學問題 計算幾何 旋轉卡殼 按順序列舉凸包上每一條邊為底邊...

狡猾的商人 bzoj1202,HNOI2005

ac通道 分析 因為每月的總收入可以為正,也可以為負,所以要比較兩個區間是否相符,當且僅當它們邊界都相同時才能比較。我們設w i 表示第1 i個月的總收入與第1 fa i 1 個月的總收入之差,及第fa i i個月的總收入。如圖。若i 1,j在同乙個集合中,則第i j個月的總收入為w j w i 1...