• 2017ACM/ICPC亚洲区沈阳站 C Hdu-6219 Empty Convex Polygons 计算几何 最大空凸包


    题面

    题意:给你一堆点,求一个最大面积的空凸包,里面没有点.

    题解:红书板子,照抄完事,因为题目给的都是整点,所以最后答案一定是.5或者.0结尾,不用对答案多做处理

       

     1 #include<bits/stdc++.h>
     2 #define N 55
     3 using namespace std;
     4 struct rec
     5 {
     6     double x,y;
     7 };
     8 rec operator -(rec a,rec b)
     9 {
    10     rec c;
    11     c.x=a.x-b.x;
    12     c.y=a.y-b.y;
    13     return c;
    14 }
    15 double sqr(double a)
    16 {
    17     return a*a;
    18 }
    19 int sign(double a)
    20 {
    21     if (fabs(a) <= 1e-6) return 0;
    22     return a<0?-1 :1;
    23 }
    24 bool operator <(rec a,rec b)
    25 {
    26      return sign(b.y-a.y)>0 || sign(b.y-a.y)==0 && sign(b.x-a.x)>0;
    27 }
    28 double max(double a,double b)
    29 {
    30     return a>b ?a:b;
    31 }
    32 double length(rec a)
    33 {
    34     return sqrt(sqr(a.x)+sqr(a.y));
    35 }
    36 double cross(rec a,rec b)
    37 {
    38     return a.x*b.y-a.y*b.x;
    39 }
    40 rec dot[N],lis[N];
    41 double opt[N][N];
    42 int seq[N],n,len;
    43 double ans;
    44 bool Compare(rec a,rec b)
    45 {
    46     int temp=sign(cross(a,b));
    47     if (temp!=0) return temp>0;
    48     temp=sign(length(b)-length(a));
    49     return temp>0;
    50 }
    51 void solve(int vv)
    52 {
    53     int t,i,j,_len;
    54     for (i=len=0;i<n;i++)
    55         if (dot[vv]<dot[i]) lis[len++]=dot[i]-dot[vv];
    56     for (int i=0;i<len;i++)
    57         for (int j=0;j<len;j++)
    58             opt[i][j]=0;
    59     sort(lis,lis+len,Compare);
    60     double v;
    61     for (t=1;t<len;t++)
    62     {
    63         _len=0;
    64         for (i=t-1;i>=0 && sign(cross(lis[t],lis[i])) ==0   ;i--);
    65         while (i>=0)
    66         {
    67             v=cross(lis[i],lis[t])/2;
    68             seq[_len++]=i;
    69             for (j=i-1; j>=0 && sign(cross(lis[i]-lis[t], lis[j]-lis[t])) >0 ;j--);
    70             if (j>=0) v+=opt[i][j];
    71             ans=max(ans,v);
    72             opt[t][i]=v;
    73             i=j;
    74         }
    75         for (i = _len-2;i>=0;i--)
    76             opt[t][seq[i]]=max(opt[t][seq[i]],opt[t][seq[i+1]]);
    77     }
    78 }
    79 int T;
    80 int main()
    81 {
    82     scanf("%d",&T);
    83     while (T--)
    84     {
    85         scanf("%d",&n);
    86         for (int i=0;i<n;i++) scanf("%lf%lf",&dot[i].x,&dot[i].y);
    87         ans=0;
    88         for (int i=0;i<n;i++) solve(i);
    89         printf("%.1lf
    ",ans);
    90     }
    91     return 0;
    92 }
  • 相关阅读:
    Codeforces Gym100502H:Clock Pictures(KMP算法)
    SPOJ MINSUB
    POJ 2796:Feel Good(单调栈)
    搭建(WSTMart)php电商环境时缺少fileinfo函数
    TP微信扫码支付
    tp3.2 支付宝app支付
    tp3.2 支付宝手机网站支付
    Thinkphp3.2+PHPQRCode 二维码生成示例
    百度UEditor粘贴或插入的表格不显示边框的解决办法
    PHP:导出数据到word(包含图片)
  • 原文地址:https://www.cnblogs.com/qywhy/p/9741184.html
Copyright © 2020-2023  润新知