給定一些點的座標,要求求能夠覆蓋所有點的最小面積的矩形,輸出所求矩形的面積和四個頂點座標
輸入格式:
第一行為乙個整數n(3<=n<=50000),從第2至第n+1行每行有兩個浮點數,表示乙個頂點的x和y座標,不用科學計數法
輸出格式:
第一行為乙個浮點數,表示所求矩形的面積(精確到小數點後5位),接下來4行每行表示乙個頂點座標,要求第一行為y座標最小的頂點,其後按逆時針輸出頂點座標.如果用相同y座標,先輸出最小x座標的頂點
輸入樣例#1:複製
61.0 3.00000
1 4.00000
2.0000 1
3 0.0000
3.00000 6
6.0 3.0
輸出樣例#1:複製
18.000003.00000 0.00000
6.00000 3.00000
3.00000 6.00000
0.00000 3.00000
最小的覆蓋矩形肯定有邊在凸包上
先求出凸包,然後列舉凸包上的邊為直線構造矩形
用單調棧求出離該直線最遠的點,左邊最遠的點和右邊最遠的點
就可以算出矩形的四個點
有可能輸出-0.0000,所以要特判
1 #include2 #include3 #include4 #include5 #include6using
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 然後就會想我一樣...