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; }