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;
}
posted @ 2012-06-27 19:35  Naix_x  阅读(251)  评论(0编辑  收藏  举报