题目链接:点击打开链接
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <algorithm>
#define inf 1<<26
#define maxn 10
#define maxe 1000000
using namespace std;
int n;
double r[maxn];
double p[maxn];
int main()
{
// freopen("input.txt","r",stdin);
int i,j;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%lf",&r[i]);
}
sort(r,r+n);
double ans=1e15;
do
{
double ll,rr;
p[0]=r[0];
ll=p[0]-r[0],rr=p[0]+r[0];
for(i=1;i<n;i++)//枚举和前面的那个圆相切
{
p[i]=p[i-1]+2.0*sqrt(r[i-1]*r[i]);
for(j=0;j<i;j++)
{
p[i]=max(p[i],p[j]+2.0*sqrt(r[i]*r[j]));//确定某个位置的圆心位置,2.0*sqrt(r[i]*r[j])是计算当某个圆与其前面的圆相切是的情况x的距离
}
ll=min(p[i]-r[i],ll);//确定左边的位置
rr=max(p[i]+r[i],rr);//确定右边的位置
}
ans=min(ans,rr-ll);//选择最小的排列
}while(next_permutation(r,r+n));
printf("%.3lf\n",ans);
}
return 0;
}