旋轉卡殼,orz orz orz
給定一些點的座標,要求求能夠覆蓋所有點的最小面積的矩形,輸出所求矩形的面積和四個頂點座標輸入格式:第一行為乙個整數n(3<=n<=50000),從第2至第n+1行每行有兩個浮點數,表示乙個頂點的x和y座標,不用科學計數法輸出格式:第一行為乙個浮點數,表示所求矩形的面積(精確到小數點後5位),接下來4行每行表示乙個頂點座標,要求第一行為y座標最小的頂點,其後按逆時針輸出頂點座標.如果用相同y座標,先輸出最小x座標的頂點輸入樣例#1:複製
6 1.0 3.000001 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
感謝 @intruder 提供題目簡述
由於某個神奇的結論,一定會有一條邊在凸殼上,列舉每條凸殼上的邊。那麼對於這條邊的對面有乙個對鐘點(即高最大,叉積最大),由於顯然位置單調,利用叉積卡殼單調列舉即可,類似的可以利用點積最小和最大的點可以找出最左點和最右點,這樣就保證可以覆蓋所有點,然後略用一點初中幾何知識,就可以了。
極度卡精度orz
#include#include#include#includeusing namespace std;typedef double db;
const int maxn = 5e5+5;
const db eps = 1e-8;
struct node
friend node operator*(node aa,db bb) ;
}friend db operator^(node aa,node bb)
friend node operator+(node aa,node bb) ;
}friend node operator-(node aa,node bb) ;
}friend db dis(node aa)
friend db chaji(node aa,node bb,node cc)
friend db diji(node aa,node bb,node cc)
friend bool cp(node aa,node bb)
}z[maxn],s[maxn],as[10]; int tp; db ans=1e18;;
bool cmp(node aa,node bb)
int n;
void gethull()
int tmp = tp;
for(int i=n-1;i>=1;i--)
--tp;
s[tp+1] = s[1];
}void kaker()
}}int main()
gethull();
kaker();
printf("%.5f\n",ans);
int fi = 1;
for(int i=2;i<=4;i++)
for(int i=fi;i<=4;i++)
for(int i=1;i}
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 然後就會想我一樣...