• UVA 10173 (几何凸包)


    判断矩形能包围点集的最小面积:凸包

      1 #include <iostream>
      2 #include <cmath>
      3 #include <cstdio>
      4 #include <cstring>
      5 #include <cstdlib>
      6 #include <string>
      7 #include <sstream>
      8 #include <algorithm>
      9 #define Max 2147483647
     10 #define INF 0x7fffffff
     11 #define ll long long
     12 #define mem(a,b) memset(a,b,sizeof(a))
     13 #define repu(i, a, b) for(int i = (a); i < (b); i++)
     14 const double PI=-acos(-1.0);
     15 #define eps 1e-8
     16 #define N 50010
     17 using namespace std;
     18 struct Point
     19 {
     20     double x,y;
     21     Point() {}
     22     Point(double x0,double y0):x(x0),y(y0) {}
     23 };
     24 Point p[N];
     25 int con[N];
     26 int cn;
     27 int n;
     28 struct Line
     29 {
     30     Point a,b;
     31     Line() {}
     32     Line(Point a0,Point b0):a(a0),b(b0) {}
     33 };
     34 double Xmult(Point o,Point a,Point b)
     35 {
     36     return (a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y);
     37 }
     38 double Dmult(Point o,Point a,Point b)
     39 {
     40     return (a.x-o.x)*(b.x-o.x)+(a.y-o.y)*(b.y-o.y);
     41 }
     42 int Sig(double a)
     43 {
     44     return a<-eps?-1:a>eps;
     45 }
     46 double Dis(Point a,Point b)
     47 {
     48     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
     49 }
     50 int cmp(Point a,Point b)
     51 {
     52     double d=Xmult(p[0],a,b);
     53     if(d>0)
     54         return 1;
     55     if(d==0 && Dis(p[0],a)<Dis(p[0],b))
     56         return 1;
     57     return 0;
     58 }
     59 double min(double a,double b)
     60 {
     61     return a<b?a:b;
     62 }
     63 void Graham()
     64 {
     65     int i,ind=0;
     66     for(i=1; i<n; i++)
     67         if(p[ind].y>p[i].y || (p[ind].y==p[i].y) && p[ind].x>p[i].x)
     68             ind=i;
     69     swap(p[ind],p[0]);
     70     sort(p+1,p+n,cmp);
     71     con[0]=0;
     72     con[1]=1;
     73     cn=1;
     74     for(i=2; i<n; i++)
     75     {
     76         while(cn>0 && Sig(Xmult(p[con[cn-1]],p[con[cn]],p[i]))<=0)
     77             cn--;
     78         con[++cn]=i;
     79     }
     80     int tmp=cn;
     81     for(i=n-2; i>=0; i--)
     82     {
     83         while(cn>tmp && Sig(Xmult(p[con[cn-1]],p[con[cn]],p[i]))<=0)
     84             cn--;
     85         con[++cn]=i;
     86     }
     87 }
     88 double Solve()
     89 {
     90     int t,r,l;
     91     double ans=999999999;
     92     t=r=1;
     93     if(cn<3)
     94         return 0;
     95     for(int i=0; i<cn; i++)
     96     {
     97         while(Sig( Xmult(p[con[i]],p[con[i+1]],p[con[t+1]])-
     98                    Xmult(p[con[i]],p[con[i+1]],p[con[t]])   )>0)
     99             t=(t+1)%cn;
    100         while(Sig( Dmult(p[con[i]],p[con[i+1]],p[con[r+1]])-
    101                    Dmult(p[con[i]],p[con[i+1]],p[con[r]])   )>0)
    102             r=(r+1)%cn;
    103         if(!i) l=r;
    104         while(Sig( Dmult(p[con[i]],p[con[i+1]],p[con[l+1]])-
    105                    Dmult(p[con[i]],p[con[i+1]],p[con[l]])   )<=0)
    106             l=(l+1)%cn;
    107         double d=Dis(p[con[i]],p[con[i+1]]);
    108         double tmp=Xmult(p[con[i]],p[con[i+1]],p[con[t]])*
    109                    ( Dmult(p[con[i]],p[con[i+1]],p[con[r]])-
    110                      Dmult(p[con[i]],p[con[i+1]],p[con[l]]) )/d/d;
    111         ans=min(ans,tmp);
    112     }
    113     return ans;
    114 }
    115 int main()
    116 {
    117     int i,T;
    118     scanf("%d",&T);
    119     repu(kase,1,T+1)
    120     {
    121         scanf("%d",&n);
    122         n *= 4;
    123         for(i=0; i<n; i++)
    124             scanf("%lf%lf",&p[i].x,&p[i].y);
    125         Graham();
    126         printf("Case #%d:
    %.0lf
    ",kase,Solve());
    127     }
    128     return 0;
    129 }
    View Code
  • 相关阅读:
    Atitit 华为基本法 attilax读后感
    Atitit 华为管理者内训书系 以奋斗者为本 华为公司人力资源管理纲要 attilax读后感
    Atitit 项目版本管理gitflow 与 Forking的对比与使用
    Atitit 管理的模式扁平化管理 金字塔 直线型管理 垂直管理 水平管理 矩阵式管理 网状式样管理 多头管理 双头管理
    Atitit 乌合之众读后感attilax总结 与读后感结构规范总结
    深入理解 JavaScript 异步系列(4)—— Generator
    深入理解 JavaScript 异步系列(3)—— ES6 中的 Promise
    深入理解 JavaScript 异步系列(2)—— jquery的解决方案
    深入理解 JavaScript 异步系列(1)——基础
    使用 github + jekyll 搭建个人博客
  • 原文地址:https://www.cnblogs.com/ACMERY/p/4540465.html
Copyright © 2020-2023  润新知