Problem: Example

Input

2
10 10


Output

40.00000000

Solution (in CPP):

Solution:
#include <algorithm>
#include <functional>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <bitset>
#include <climits>

#define all(c) (c).begin(), (c).end()
#define rep(i,n) for(int i=0;i<(n);i++)
#define pb(e) push_back(e)
#define mp(a, b) make_pair(a, b)
#define fr first
#define sc second

const int INF=100000000;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
using namespace std;
typedef pair<int ,int > P;
typedef long long ll;
struct Circle {
    double x,y,r;
    Circle(double x=0,double y=0,double r=0):
        x(x),y(y),r(r){}
};

// c1, c2??????????????????
bool ok(const Circle &c1, const Circle &c2) {
    double d = sqrt((c1.x-c2.x)*(c1.x-c2.x)+(c1.y-c2.y)*(c1.y-c2.y));
    return d > c1.r+c2.r && c1.x < c2.x;
}
double dist(Circle c1, Circle c2) {
    double x=c1.x-c2.x;
    double y=c1.y-c2.y;
    return sqrt(x*x+y*y);
}

int n;
int r[502];
Circle cs[502];

bool ok(int m) {
    if(cs[m].x-cs[m].r<0) return false;
    rep(i,m) {
        //cout<<"comp: "<<i<<", "<<m<<endl;
        if(!ok(cs[i],cs[m])) return false;
    }

    return true;
}

void func(int m) {
    double lb=0,ub=INF;
    rep(i,100) {
        double mid=(lb+ub)/2;
        cs[m].x=mid;
        if(ok(m)) ub=mid;
        else lb=mid;
    }
}

int main() {
    cin>>n;
    rep(i,n) cin>>r[i];
    rep(i,n) cs[i]=Circle(0,r[i],r[i]);
    rep(i,n) func(i);
    double ans=0;
    rep(i,n) ans=max(ans,cs[i].x+cs[i].r);
    printf("%.8f\n",ans);
    return 0;
}