bzoj1069 最大土地面積

2022-06-03 07:48:08 字數 1489 閱讀 8456

在某塊平面土地上有n個點,你可以選擇其中的任意四個點,將這片土地圍起來,當然,你希望這四個點圍成

的多邊形面積最大。

第1行乙個正整數n,接下來n行,每行2個數x,y,表示該點的橫座標和縱座標。

最大的多邊形面積,答案精確到小數點後3位。

50 0

1 01 1

0 10.5 0.5

1.000

資料範圍 n<=2000, |x|,|y|<=100000

solution

顯然四個點都在凸包上啊!

顯然的,我們列舉對角線,我們現在的問題是找離對角線最遠的點是哪兩個點

於是我們發現,當a固定,c變為逆時針的下乙個點的時候,

b,d也一定是單調逆時針變動的

這裡運用旋轉卡殼的思想

所以這題本質是旋轉卡殼,只是更加簡單了

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define il inline

#define re register

using

namespace

std;

typedef

double

db;const

int n=3001

;const db eps=1e-8

;struct

p a[n],s[n];

int n,top;db ans=0

;il p

operator-(p a,p b);

} il db

operator*(p a,p b)

il db s(p a,p b,p c)

il db dis(p a)

il db cmp(p x,p y)

il void

print(p a)

intmain()

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

if(a[i].y1].y||(a[i].y==a[1].y&&a[i].x1].x)) swap(a[1

],a[i]);

sort(a+2,a+n+1

,cmp);

s[1]=a[1];s[2]=a[2];top=2

;

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

if(top==4)//

for(int i=1;i<=top;i++) print(s[i]);

for(int i=0;i1

]; n=top;

for(int i=0;i)

}printf(

"%.3lf

",ans);

return0;

}

BZOJ 1069 最大土地面積

給出平面上的一些點,找出四個點使這四個點圍成的面積最大。首先這四個點肯定在凸包上 顯然。所以求出凸包後 n 地列舉乙個點,之後利用旋轉卡殼求出與這個點相距最遠的點,然後列舉所有點找出兩邊三角形的最大面積取最大即可。這題主要是板子吧,背會就好背會就好 include include include i...

bzoj 1069 最大土地面積

題目大意 一些點,選四個點使這圍成的四邊形面積最大 思路 首先可以知道這些點一定在凸包上,然後graham求一下凸包 然後我們可以列舉對角線在兩邊找最遠的點 然而這樣複雜度爆了 所以我們可以利用旋轉卡殼的思想 列舉對角線的時候確定乙個點,然後旋轉另乙個點,如果確定了另外兩個點,則另外兩個點也一起轉 ...

BZOJ 1069 最大土地面積(旋轉卡殼)

time limit 1 sec memory limit 128 mb submit 3475 solved 1385 submit status discuss 在某塊平面土地上有n個點,你可以選擇其中的任意四個點,將這片土地圍起來,當然,你希望這四個點圍成 的多邊形面積最大。第1行乙個正整數n...