zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    编译安装glibc
    Android SDK下载
    Ubuntu下Android编译环境的配置
    ubuntu常用命令
    硬盘概念解析
    ubuntu官方源列表网址
    Win7系统下利用U盘安装Ubuntu14.04麒麟版
    jdk5下载链接
    vim跳到文件头和文末结尾
    vim 全局替换命令
  • 原文地址:https://www.cnblogs.com/slothrbk/p/8962417.html
Copyright © 2011-2022 走看看