题目链接
1 /*
2 Name:nyoj-952-最大四边形
3 Copyright:
4 Author:
5 Date: 2018/4/27 10:46:24
6 Description:
7 枚举一条对角线,再选择一个
8 看大佬们的解释,在二维向量中,叉乘的结果(仍是向量)等于面积
9 利用叉乘求三角形面积,点的顺时针,
10 逆时针的正负不同,知道这个点在对角线的哪侧,
11 分别求出各侧面积的最大的,俩个相加,就为这条对角线所获的最大四边形面积
12 */
13 #include <iostream>
14 #include <cstdio>
15 #include <cstring>
16 using namespace std;
17 const double eps = 1e-8;
18 struct node{
19 double x ,y;
20 } arr[305];
21 double cross(node a,node b1,node b2){//求(b1-a) 和(b2-a) 的叉乘
22 double x1,y1,x2,y2;
23 x1=b1.x-a.x;
24 y1=b1.y-a.y;
25 x2=b2.x-a.x;
26 y2=b2.y-a.y;
27 return x1*y2-x2*y1;
28 }
29 int main()
30 {
31 int n;
32 while (cin>>n) {
33 memset(arr, 0, sizeof(arr));
34 for (int i=0; i<n; i++) {
35 cin>>arr[i].x>>arr[i].y;
36 }
37 double lmax = 0, rmax = 0, area = 0;
38 for (int i=0; i<n; i++) {
39 for (int j=i+1; j<n; j++) {
40 lmax = 0, rmax = 0;//如果向量结果为负,取最大值还是0,当然左右是一负一正
41 for(int k=0; k<n; k++) {
42 if (k != i && k!= j){
43 /*
44 分别求出对角线两边的最大面积,向量点乘求出对角线一侧的面积
45 在没有除以2的时候,求得是平行四边形的面积
46
47 求出左右面积最大的情况相加,就是最大的两个平行四边形的面积,
48 除以2,就是将对角线相同的两个平行四边形各取一半拼起来的最大情况
49 */
50 double tmp = cross(arr[i], arr[j], arr[k]);
51 lmax = max(lmax, tmp);
52 rmax = max(rmax, -tmp);
53 }
54 }
55 if(lmax <= eps || rmax <= eps) continue;
56 area = max(area, lmax + rmax);
57 }
58 }
59 printf("%lf
", area / 2);
60 }
61 return 0;
62 }