nyoj-952-最大四边形 (向量叉乘)

题目链接

 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 }
原文地址:https://www.cnblogs.com/langyao/p/8962417.html