• 旋转卡壳 求凸多边形中面积最大的四边形


    枚举对角线,用旋转卡壳求对角线两侧的最大的三角形。
     
     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<cmath>
     6 #include<cstdlib>
     7 using namespace std;
     8 struct data
     9 {
    10     double x,y;
    11 }a[1005];
    12 double get(data p1,data p2,data p3)
    13 {
    14     return fabs((p1.x-p3.x)*(p2.y-p3.y)-(p2.x-p3.x)*(p1.y-p3.y))/2;
    15 }
    16 double max1,max2,ans,ans1;
    17 int n;
    18 int main()
    19 {
    20     freopen("quads.in","r",stdin);
    21     freopen("quads.out","w",stdout);
    22     scanf("%d",&n);
    23     for(int i=0;i<n;i++) scanf("%lf%lf",&a[i].x,&a[i].y);
    24     for(int i=0;i<n-2;i++)
    25     {
    26         int j=(i+2)%n,k=(i+1)%n,h=(j+1)%n;
    27         while(get(a[i],a[j],a[k+1])>get(a[i],a[j],a[k])) k=(k+1)%n;
    28         max1=get(a[i],a[j],a[k]);
    29         while(get(a[i],a[j],a[h+1])>get(a[i],a[j],a[h])) h=(h+1)%n;
    30         max2=get(a[i],a[j],a[h]);
    31         ans1=0;
    32         while(max1+max2>ans1&&j<n-1)
    33         {
    34             ans1=max1+max2;
    35             j=(j+1)%n;
    36             while(get(a[i],a[j],a[k+1])>get(a[i],a[j],a[k])) k=(k+1)%n;
    37             max1=get(a[i],a[j],a[k]);
    38             while(get(a[i],a[j],a[h+1])>get(a[i],a[j],a[h])) h=(h+1)%n;               
    39             max2=get(a[i],a[j],a[h]);
    40         }
    41         ans=max(ans,ans1);
    42      }
    43      printf("%.10lf
    ",ans);
    44      return 0;
    45 }
    View Code
    O(∩_∩)O~ (*^__^*) 嘻嘻…… O(∩_∩)O哈哈~
  • 相关阅读:
    GitHub的本地与远程
    linux PDF转换
    css文字样式与div
    CSS属性(pading margin)
    Q:table返回无数据点击排序无数据消失问题
    nginx 学习二(配置项)
    nginx学习一
    JS防抖节流
    通过node实现阿里云短信接口,并将手机号缓存,通过Redis过期时间限制频繁发短信
    web框架express学习三
  • 原文地址:https://www.cnblogs.com/wls001/p/7744947.html
Copyright © 2020-2023  润新知