SCOI2007 最大土地面積

2022-06-04 13:15:16 字數 1572 閱讀 4169

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

輸入格式:

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

輸出格式:

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

輸入樣例#1: 

5

0 01 0

1 10 1

0.5 0.5

輸出樣例#1: 

1.000

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

2000的話因為可以n^2,所以我們先處理出凸包(最優的四個頂點肯定在凸包上,可以考慮反證法),然後列舉一下對角線,我們的目的是要讓兩側的

三角形面積最大。隨著列舉的節點的極角的增大,剩下兩個點的移動也是單調的,因為三角形面積的函式在凸包上是單增的。

所以就水出來了23333

#include#define ll long long

#define maxn 2005

using namespace std;

const double eps=10e-9;

inline int zt(double x)

struct node;

} node operator +(const node &u)const; }

bool operator <(const node &u)const

}a[maxn],hill[maxn];

int n,m,p[maxn];

double ans;

inline double xmul(node x,node y)

inline bool equal(node x,node y)

inline void get_hill()

for(int i=1;i<=now;i++) hill[i]=a[p[i]];

tot=now,now=0;

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

for(int i=now;i;i--) if(!equal(a[p[i]],hill[tot])) hill[++tot]=a[p[i]];

if(equal(hill[tot],hill[1])) tot--;

// for(int i=1;i<=tot;i++) printf("%lf %lf\n",hill[i].x,hill[i].y);

n=tot;

}inline int mo(int x,const int ha)

inline void solve()

topt=mo(pt2,n)+1;

while(xmul(hill[j]-hill[i],hill[topt]-hill[i])>xmul(hill[j]-hill[i],hill[pt2]-hill[i]))

ans=max(ans,(xmul(hill[pt1]-hill[i],hill[j]-hill[i])+xmul(hill[j]-hill[i],hill[pt2]-hill[i]))/2.00);

} }}int main()

SCOI2007 最大土地面積

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

SCOI2007 最大土地面積

嘟嘟嘟 無意間看到了乙個計算幾何。n 2000 就很愉快了。列舉求完凸包後 o n 2 列舉對角線,然後另兩個點用旋轉卡殼維護就完事了。結果資料 或是題意 坑人,有的有重複的點,如果選了兩個重複的點的話就算成三角形了 憑什麼 所以應該求乙個最簡凸包 就是點最少 哎,本來十幾分鐘就寫完了的,因為這個坑...

SCOI2007 最大土地面積

題意 從n個點裡選4個點圍成乙個四邊形,求四邊形的最大面積。n leq 2000 題解 列舉對角線,預處理每條對角線左邊 右邊的面積最大點,類似於旋轉卡殼。複雜度 o n include define maxn 5005 define maxm 500005 define inf 0x7ffffff...