description
在某塊平面土地上有n個點,你可以選擇其中的任意四個點,將這片土地圍起來,當然,你希望這四個點圍成
的多邊形面積最大。
input
第1行乙個正整數n,接下來n行,每行2個數x,y,表示該點的橫座標和縱座標。
output
最大的多邊形面積,答案精確到小數點後3位。
sample input
5 0 0
1 0
1 1
0 1
0.5 0.5
sample output
1.000
hint
資料範圍 n<=2000, |x|,|y|<=100000
分析:
明確我們要找的點一定在凸包上,
二話不說先來乙個凸包
注意:凸包的板子不要打錯了
這樣我們在凸包上就可以卡殼了
我們列舉四邊形的對角線,在四邊形的兩側找到距離對角線最遠的兩個點
計算這樣的四邊形的面積,取max
因為距離最遠的點也是單調的,所以時間o(n^2)
很奇怪我第一次t了
看一下怎麼找距離最遠的點吧
double k=fabs(cross(po[sta[p2]]-po[sta[i]],po[sta[p1+1]]-po[sta[i]]))
-fabs(cross(po[sta[p2]]-po[sta[i]],po[sta[p1]]-po[sta[i]]));
if (dcmp(k)<=0) break;
else p1++; //p1+1離ip2更遠
k是i和p2(對角線)分別和p1+1,p1構成的三角形的面積差
如果k>0說明p1距離對角線更遠
#include
#include
#include
#include
#include
using
namespace
std;
const
double inf=1e10;
const
double eps=1e-10;
const
int n=2010;
struct node
};node po[n];
int n,sta[n],top;
int dcmp(double x)
int cmp(const node &a,const node &b)
node operator -(const node &a,const node &b)
node operator *(const node &a,const
double &b)
node operator /(const node &a,const
double &b)
bool
operator ==(const node &a,const node &b)
double mx(double a,double b)
double cross(node x,node y)
double dot(node x,node y)
void tub()
int k=top;
for (i=n-1;i>=1;i--)
if (n>1) top--;
}double len(node a,node b,node p)
double ss(node a,node b,node c,node d)
void solve()
while (1)
//if (p3>=top+i) break; //轉了超過一圈
ans=mx(ans,ss(po[sta[i]],po[sta[p1]],po[sta[p2]],po[sta[p3]])); //順時針 } }
printf("%0.3lf",ans);
}int main()
BZOJ1069 SCOI2007 最大土地面積
資料範圍2000,我們如果列舉對角線然後走呢,是不是n 3呢,仔細一想不是。因為面積是乙個單增的過程,所以建完凸包以後列舉對角線複雜度就是n 2的。因此這題我們就從乙個四邊形面積轉化為兩個三角形面積。by 大奕哥 1 include2 using namespace std 3 typedef do...
bzoj1069 SCOI2007 最大土地面積
在某塊平面土地上有n個點,你可以選擇其中的任意四個點,將這片土地圍起來,當然,你希望這四個點圍成的多邊形面積最大。第1行乙個正整數n,接下來n行,每行2個數x,y,表示該點的橫座標和縱座標。最大的多邊形面積,答案精確到小數點後3位。50 0 1 01 1 0 10.5 0.5 1.000 資料範圍 ...
bzoj1069 SCOI2007 最大土地面積
description 在某塊平面土地上有n個點,你可以選擇其中的任意四個點,將這片土地圍起來,當然,你希望這四個點圍成 的多邊形面積最大。input 第1行乙個正整數n,接下來n行,每行2個數x,y,表示該點的橫座標和縱座標。output 最大的多邊形面積,答案精確到小數點後3位。sample i...