• HDU-3548-Enumerate the Triangles


    求由所有的点组成的三角形中周长最小的三角形的周长

    1.将所有的点按横坐标大小排序

    2.从第一个点开始往后枚举,判断能否组成三角形,判断当前三角形周长是否小于已经得到的最小周长

    代码如下:

    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<cmath>
    using namespace std;
    const double INF=1000000000.0;
    double juli(double x1,double y1,double x2,double y2)
    {
        return (sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)));
    }
    struct point
    {
        int x;
        int y;
    } p[1000+10];
    bool cmp(point a,point b)
    {
        return a.x<b.x;
    }
    bool One_Line(const point& s1,const point &s2,const point &s3 )
    {
        return (s3.x-s2.x)*(s2.y-s1.y) == (s2.x-s1.x)*(s3.y-s2.y);
    }
    int main()
    {
        int T,n,i,j,t=1;
        scanf("%d",&T);
        while(T--)
        {
            cin>>n;
            for(i=0; i<n; i++)
                cin>>p[i].x>>p[i].y;
            sort(p,p+n,cmp);
            double mini=INF;
            int flog=0;
            for(i=0; i<n; i++)
            {
                for(j=i+1; j<n; j++)
                {
                    if(mini<=2*(p[j].x-p[i].x)) break ;//横坐标的差大于周长的一半,它都大于周长的一半了
                                                       //由这两点组成的三角形周长肯定大于mini,不要
                    double a1=juli(p[i].x,p[i].y,p[j].x,p[j].y);
                    if(mini<=2*a1) continue ;          //同上,只是不跳出循环,判断下一个
                    for(int k=j+1; k<n; k++)
                    {
                        if(mini<=2*(p[j].x-p[k].x)) break ;
                        if(One_Line(p[i],p[j],p[k])) continue ;
                        double a2=juli(p[j].x,p[j].y,p[k].x,p[k].y);
                        double a3=juli(p[i].x,p[i].y,p[k].x,p[k].y);
                        if(a1+a2+a3<mini)
                        {
                            mini=a1+a2+a3;
                            flog=1;
                        }
                    }
                }
            }
            cout<<"Case "<<t++<<": ";
            if(flog) printf("%.3lf
    ",mini);
            else cout<<"No Solution"<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    使用vim + cscope/ctags
    python类库32[序列化和反序列化之pickle]
    Perforce2012新特征=20个用户免费+云
    Linux进程的uid和euid
    perl安装模块到自己的home ( install perl module without root)
    Python分布式+云计算
    Linux命令xargs+cut
    python实例32[简单的HttpServer]
    Python转载[编码规范]
    Linux命令lsof
  • 原文地址:https://www.cnblogs.com/Houheshuai/p/3697148.html
Copyright © 2020-2023  润新知