題意:平面上n個點(n<=300),問任意四個點組成的四邊形(保證四條邊不相交)的最大面積是多少。
分析:1、第一思路是列舉四個點,以o(n4)的演算法妥妥超時。
2、以下思路源自官方題解
以o(n2)列舉每一條邊,以這條邊作為四邊形的對角線(注意:這裡所說的對角線是指把四邊形分成兩部分的線,不考慮凹四邊形可能出現的兩個點在對角線同一側的情況),以o(n)列舉每乙個點,判斷是在對角線所在直線的左側還是右側。因為被對角線分割開的兩三角形不相關,所以可以單獨討論:分別找出左右兩側的最大三角形,二者之和即為此邊對應的最大四邊形。整個演算法為o(n3)。
3、何為叉積?
一、axb 表示的是乙個符合右手法則的、垂直於a、b的向量c,|c|=|a|*|b|*sinθ,θ指向量a,b的夾角,即|c|是以a、b為邊的平行四邊形的面積——已知3點a,b,c,|baxca|==s(三角形abc)*2。
二、座標表示法中,a(x1,y1),b(x2,y2)。c=axb=x1*y2-x2*y1,c的正負表示方向,正為上、負為下。而在三維中,方向不能簡單的以正負表示,所以只能以乙個向量的形式來描述:
| i , j , k |
|x1,y1,z1|
|x2,y2,z2| i,j,k分別表示x軸、y軸、z軸上的單位向量,矩陣的解也就是c=axb。
這裡只是二維平面,判斷點在向量所在直線的哪一側,就可以利用叉積的方向來區別。對角線ab,兩側各取一點c、d,必然有caxcb=-daxdb。
**:
#include #include #include #include #include using namespace std;
#define eps 1e-10
#define maxn 310
typedef struct pointp;
p point[maxn];
double cross(point p1,point p2,point p0)
double max(double a,double b)
int main()
else}}
if(lmax==0 || rmax==0)continue;
ans=max(ans,(rmax+lmax));}}
printf("%lf\n",ans);
}return 0;
}
已知四邊形四條邊求四邊形最大面積
有四根木棍,長度分別為 a b c d 求著四根木棍組成四邊形的最大面積。輸入格式 第一行包含乙個整數 ca ca 10000 表示有 ca 組測試資料,對於每組測試資料 輸入包含一行,該行包含四個整數 a b c d 1 a b c d 1000 輸出格式 對於每組測試資料,輸出 case c a...
計算幾何 求n個點中最大四邊形
define size 2100 struct point tp size 叉積,oa ob inline llt cross point t const o,point t const a,point t const b a如果比b更靠下更靠左返回真 inline bool islowleft p...
定義四邊形 圓的內接四邊形
1 圓內接多邊形定義 多邊形的所有頂點都在同乙個圓上,這個多邊形叫圓內接多邊形,這個圓叫這個多邊形的外接圓。2 圓內接四邊形定義 四邊形的所有頂點都在同乙個圓上,這個四邊形叫圓內接四邊形,這個圓叫這個四邊形的外接圓。3 判定定理 如果乙個四邊形的對角互補,那麼它的四個頂點在同乙個圓上 簡稱四點共圓 ...