zoukankan      html  css  js  c++  java
  • HDU 2202 计算几何

    最大三角形

    Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 4015    Accepted Submission(s): 1433


    Problem Description
    老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大。
    Eddy对这道题目百思不得其解,想不通用什么方法来解决,因此他找到了聪明的你,请你帮他解决这个题目。
     
    Input
    输入数据包含多组测试用例,每个测试用例的第一行包含一个整数n,表示一共有n个互不相同的点,接下来的n行每行包含2个整数xi,yi,表示平面上第i个点的x与y坐标。你可以认为:3 <= n <= 50000 而且 -10000 <= xi, yi <= 10000.
     
    Output
    对于每一组测试数据,请输出构成的最大的三角形的面积,结果保留两位小数。
    每组输出占一行。
     
    Sample Input
    3 3 4 2 6 3 7 6 2 6 3 9 2 0 8 0 6 6 7 7
     
    Sample Output
    1.50 27.00
     
    Author
    Eddy
     
    代码:
     1 //最大三角形的顶点一定是凸包的顶点,先求凸包再三重循环用向量算最大的三角形面积。刚开始以为这样会超时竟然没有
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<cmath>
     7 using namespace std;
     8 int n,top;
     9 struct nod
    10 {
    11     double x,y;
    12 }p[50004],que[50004];
    13 int xy(nod p0)
    14 {
    15     p0.x-=p[0].x;
    16     p0.y-=p[0].y;
    17     if(p0.x>=0&&p[0].y>=0) return 1;
    18     if(p[0].x<=0&&p[0].y>0) return 2;
    19     if(p[0].x<0&&p[0].y<=0) return 3;
    20     if(p[0].x>=0&&p[0].y<0) return 4;
    21 }
    22 double chaji(nod p0,nod p1,nod p2)
    23 {
    24     return ((p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x));
    25 }
    26 bool cmp(nod p1,nod p2)
    27 {
    28     int L1=xy(p1),L2=xy(p2);
    29     if(L1==L2)
    30     {
    31         double tem=chaji(p[0],p1,p2);
    32         if(tem>0) return 1;
    33         if(tem<0) return 0;
    34         if(tem==0)
    35         return p1.x<p2.x;
    36     }
    37     else return L1<L2;
    38 }
    39 void tubao()
    40 {
    41     top=0;
    42     que[top].x=p[0].x;que[top++].y=p[0].y;
    43     que[top].x=p[1].x;que[top++].y=p[1].y;
    44     que[top].x=p[2].x;que[top].y=p[2].y;
    45     for(int i=3;i<=n;i++)
    46     {
    47         while(chaji(que[top-1],que[top],p[i])<=0)
    48         top--;
    49         que[++top].x=p[i].x;
    50         que[top].y=p[i].y;
    51     }
    52 }
    53 int main()
    54 {
    55     while(scanf("%d",&n)!=EOF)
    56     {
    57         double Minx=10000007,Miny=10000007;
    58         int Mini;
    59         for(int i=0;i<n;i++)
    60         {
    61             scanf("%lf%lf",&p[i].x,&p[i].y);
    62             if(p[i].y<Miny)
    63             {
    64                 Miny=p[i].y;
    65                 Minx=p[i].x;
    66                 Mini=i;
    67             }
    68             else if(p[i].y==Miny&&p[i].x<Minx)
    69             {
    70                 Minx=p[i].x;
    71                 Mini=i;
    72             }
    73         }
    74         if(n==1||n==2)
    75         {
    76             printf("0.00
    ");
    77             continue;
    78         }
    79         double tem=p[0].x;
    80         p[0].x=p[Mini].x;
    81         p[Mini].x=tem;
    82         tem=p[0].y;
    83         p[0].y=p[Mini].y;
    84         p[Mini].y=tem;
    85         sort(p+1,p+n,cmp);
    86         p[n].x=p[0].x;p[n].y=p[0].y;
    87         tubao();
    88         double ans=0.0;
    89         for(int i=0;i<=top-2;i++)
    90         for(int j=i+1;j<=top-1;j++)
    91         for(int k=j+1;k<=top;k++)
    92         {
    93             ans=max(fabs(chaji(que[i],que[j],que[k])),ans);
    94         }
    95         printf("%.2lf
    ",ans/2);
    96     }
    97     return 0;
    98 }
  • 相关阅读:
    在Ubuntu上安装Mono
    CSS 外边距(margin)重叠及防止方法
    如何通过 iframe 共享 jQuery $.data?
    给ajax表单提交数据前面加上实体名称
    发布web应用程序是出现unsafe code
    ASP.NET MVC 基于页面的权限管理
    jquery旋转图片
    artTemplate子模板include
    JS调试必备的5个debug技巧_javascript技巧
    jQuery中position()与offset()区别
  • 原文地址:https://www.cnblogs.com/--ZHIYUAN/p/6080780.html
Copyright © 2011-2022 走看看