在某塊平面土地上有n個點,你可以選擇其中的任意四個點,將這片土地圍起來,當然,你希望這四個點圍成的多邊形面積最大。
輸入格式:
第1行乙個正整數n,接下來n行,每行2個數x,y,表示該點的橫座標和縱座標。
輸出格式:
最大的多邊形面積,答案精確到小數點後3位。
輸入樣例#1:
50 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...