nyoj-952-最大四边形 (向量叉乘)
Posted 朤尧
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n", area / 2); 60 } 61 return 0; 62 }
以上是关于nyoj-952-最大四边形 (向量叉乘)的主要内容,如果未能解决你的问题,请参考以下文章