25117-8 圆排列问题2

2511   7-8 圆排列问题2

题目描述

给定 n个大小不等的圆c1 , c2 , ……, cn ,现要将这 n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。例如,当n=3,且所给的3 个圆的半径分别为1,1,2时,这3个圆的最小长度的圆排列如图所示。其最小长度为2 + 4*√ 2(说明:根号2) 。

解圆排列问题的一个随机化算法如下。
static void Circle_search(int []x,int n)
  {
        random_perm(x);
        boolean found=true;
        while(found){
            found=false;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    if(MyMath.swap(x,i,j) reduces length){
                              MyMath.swap(x,i,j);
                              found=true;
                         }
             }
}
其中,random_perm(x)产生x 的一个随机排列。

根据上述算法框架,设计一个随机化算法,对于给定的n个圆,计算n个圆的最佳排列方案,使其长度尽可能小。

输入格式:

输入数据第一行有1个正整数n (1≤n≤20)。接下来的1行有n个数,表示n个圆的半径。

输出格式:

输出最小圆排列的长度

输入样例 复制
3
1 1 2
输出样例 复制
7.65685

说明

0
10
通过提交
时空限制1000ms/128mb
题目来源
评测方式在线评测
题目类型
难        度