HDU 3548 Enumerate the Triangles(暴力+剪枝)

题目链接

 今天考物理直接掉人品了,基本上没有会做的。。。希望可以过吧。。。。

题目大意:给出坐标1000个,求出能组成三角形最小的周长。

 这个题直接暴力 + 剪枝,自己想的几个小剪枝都没把他水过去,在解题报告的帮助下,终于水过去了。。。

#include <stdio.h>

#include <math.h>

#include <string.h>

#define N 1000000

double x[1001],y[1001],mop[1001][1001];

int main()

{

    int t,n,i,j,k,num = 0;

    double min,a,b,c,z,key;

    scanf("%d",&t);

    while(t--)

    {

        num ++;

        min = N;

        scanf("%d",&n);

        for(i = 1; i <= n; i ++)

            scanf("%lf%lf",&x[i],&y[i]);

        printf("Case %d: ",num);

        for(i = 1; i <= n-1; i ++)

            for(j = i+1; j <= n; j ++)

            {

                mop[i][j] = sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));//这个是看某个解题报告提示的。。。

            }

        for(i = 1; i <= n-2; i ++)

            for(j = i+1; j <= n-1; j ++)

            {

                z = (y[i]-y[j])/(x[i]-x[j]);

                a = mop[i][j];

                if(a*2 >= min)//本来我想的是a,看了解题报告后,2*a终于过了。。。

                    continue ;

                for(k = j+1; k <= n; k ++)

                {

                    key = z*(x[k]-x[i])+y[i]-y[k];

                    if(key)

                    {

                        b = mop[i][k];

                        c = mop[j][k];

                        if(a+b+c > min)

                            continue ;

                        else if(a+b > c&&b+c > a&&a+c > b)

                        {

                            min = a+b+c;

                        }

                    }

                }

            }

        if(min >= N)

            printf("No Solution\n");

        else

            printf("%.3lf\n",min);

    }

    return 0;

}

你可能感兴趣的:(enum)