#55337: c++


yp11451267@yphs.tp.edu.tw (705-43鄭丞博)


#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <iomanip>

using namespace std;

// 計算某一特定圓排列順序下的最小外接矩形寬度
double calculate_width(const vector<double>& r, int m) {
    vector<double> x(m, 0.0);
    
    // 第一個圓的中心 X 座標就是它的半徑
    x[0] = r[0];
    
    // 依序決定每個圓的中心 X 座標
    for (int i = 1; i < m; ++i) {
        // 靠底線往左推,直到撞到前面某一個圓為止
        double max_x = r[i]; // 最左邊界至少是自己放最左邊時的半徑
        for (int j = 0; j < i; ++j) {
            double dist = x[j] + 2.0 * sqrt(r[i] * r[j]);
            if (dist > max_x) {
                max_x = dist;
            }
        }
        x[i] = max_x;
    }
    
    // 計算最右側的邊界
    double total_width = 0.0;
    for (int i = 0; i < m; ++i) {
        total_width = max(total_width, x[i] + r[i]);
    }
    
    return total_width;
}

void solve() {
    int m;
    while (cin >> m && m != 0) {
        vector<double> r(m);
        for (int i = 0; i < m; ++i) {
            cin >> r[i];
        }
        
        // 先排序以利接下來使用 next_permutation 窮舉全排列
        sort(r.begin(), r.end());
        
        double min_total_width = 1e9; // 設一個很大的初始值
        
        // 窮舉所有圓的擺放順序
        do {
            double current_width = calculate_width(r, m);
            if (current_width < min_total_width) {
                min_total_width = current_width;
            }
        } while (next_permutation(r.begin(), r.end()));
        
        // 輸出小數點後三位
        cout << fixed << setprecision(3) << min_total_width << "\n";
    }
}

int main() {
    // 最佳化輸入輸出
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    solve();
    
    return 0;
}