10012 - How Big Is It
10012 - How Big Is It?
描述:好麻烦的题目,准确的说就是给定m个圆的半径, 现在要求找到一个矩形使得每一个球都以地面相切, 要求输出最小的矩阵的长度 #include <cstdio> #include <cmath> #include <cstring> int n,m,j,flag[12]; double count,num[10],p[10],value[10]; void dfs(int cur,double x,double y) { if(cur>=m) { if(!flag[10]) count=y-x; else if(y-x<count) count=y-x; flag[10]=1; return ; } for(int i=0; i<m; i++) if(!flag[i]) { flag[i]=1; p[cur]=num[i]; value[cur]=0; for (j=0; j<cur; j++) { double c=sqrt((p[cur]+p[j])*(p[cur]+p[j])-(p[cur]-p[j])*(p[cur]-p[j]))+value[j]; if (c>value[cur]) value[cur]=c; } double a,b; if(value[cur]-p[cur]<x) a=value[cur]-p[cur]; else a=x; if(value[cur]+p[cur]>y) b=value[cur]+p[cur]; else b=y; dfs(cur+1,a,b); flag[i]=0; } } int main() { #ifndef ONLINE_JUDGE freopen("a.txt","r",stdin); #endif scanf("%d",&n); while(n--) { scanf("%d",&m); count=0; for(int i=0; i<m; i++) scanf("%lf",&num[i]); memset(flag,0,sizeof(flag)); memset(value,0,sizeof(value)); if(m>1) for(int i=0; i<m; i++) { flag[i]=1; value[0]=p[0]=num[i]; double a=value[0]-p[0]; double b=value[0]+p[0]; dfs(1,a,b); flag[i]=0; } else count=2*num[0]; printf("%.3lf\n",count); } return 0; }