problem description
老師在計算幾何這門課上給eddy布置了一道題目,題目是這樣的:給定二維的平面上n個不同的點,要求在這些點裡尋找三個點,使他們構成的三角形擁有的面積最大。
eddy對這道題目百思不得其解,想不通用什麼方法來解決,因此他找到了聰明的你,請你幫他解決這個題目。
input
輸入資料報含多組測試用例,每個測試用例的第一行包含乙個整數n,表示一共有n個互不相同的點,接下來的n行每行包含2個整數xi,yi,表示平面上第i個點的x與y座標。你可以認為:3 <= n <= 50000 而且 -10000 <= xi, yi <= 10000.
output
對於每一組測試資料,請輸出構成的最大的三角形的面積,結果保留兩位小數。
每組輸出佔一行。
sample input
3sample output3 42 6
3 76
2 63 9
2 08 0
6 67 7
1.50author27.00
eddy
recommend
lcy
思路:
最大三角形的三個點一定在點的凸包上,求出凸包之後,直接暴力列舉點即可
**:
#includeusingnamespace
std;
const
int maxn = 55000
;const
int inf = 0x3f3f3f3f
;const
int eps = 1e-8
;int sgn(double x)//
判斷浮點數x的符號,0返回0,正數返回1,負數返回-1
struct
point
point(
int _x, int
_y)
point
operator -(const point &b)const
double
operator ^(const point &b)const
//叉積
double
operator *(const point &b)const
//點積
bool
operator ==(const point &b)const
bool
operator !=(const point&b)const
void input()
};struct
line
line(point _s, point _e)
};double dist(point& a, point& b) //
*兩點間距離
point zero;
intk;
bool cmp(point& a, point &b)
if (sgn(tmp) == 0 && sgn(dist(a, zero) - dist(b, zero)) <= 0
)
return1;
return0;
}int
n;point a[maxn];
intl[maxn];
int cou = 0
;void
gram()
if (n == 2
) l[cou++] = 0
; l[cou++] = 1
;
for (int i = 2; i < n; i++)
l[cou++] =i;
}}int
main()
else
if (a[i].y ==zero.y) }}
gram();
double res = -3
;
for (int i = 0; i < cou; i++) }}
}res = res / 2
; printf("
%.2lf\n
", res);
}}
求大三角形中三角形個數
一道筆試程式設計題要求求乙個大三角形中所有小三角形的個數,大約是下面這種情況 首先想到是的將問題由求邊長為n的三角形個數 求邊長為n 1的三角形個數 求邊長為1的三角形個數 1,回溯求得所有三角形個數。但是再仔細一看因為有重疊三角形和倒置的三角形,所以這個方法不可行。接著找到三角形個數由三部分組成 ...
尋找兩個三角形重合部分的最大三角形
如圖所示,兩個三角形重合存在很多種情況,上圖舉出其中4個例子,本文要講的是已知兩個三角形三個頂點座標,求重疊部分最大三角形的頂點座標 雖然已知頂點座標,位置關係已經確定,但是程式設計解決的是一類問題,所以各種情況還是要考慮到。定義變數儲存結果 double resultx 3 double resu...
LeetCode 812 最大三角形面積
給定包含多個點的集合,從其中取三個點組成三角形,返回能組成的最大三角形的面積。示例 輸入 points 0,0 0,1 1,0 0,2 2,0 輸出 2 解釋 這五個點如下圖所示。組成的橙色三角形是最大的,面積為2。注意 3 points.length 50.不存在重複的點。50 points i ...