#include #include #include #include #include using namespace std; typedef double T; const T EPS = 1e-9; const int MAXN = 600; int n; T len[MAXN]; T DP[MAXN]; double lis[MAXN]; int t; const T PI = T(2.0) * acos(0.0); T sqr(T x) {return x*x;} T evalSum(T r2) { T aTot = 0; for(int i = 0; i < t; ++i) { aTot += asin(lis[i] / r2); if(aTot > PI + EPS) { break; } } return aTot; } T evalDiff(T r2) { T aTot = 0; aTot = -asin(lis[0] / r2); for(int i = 1; i < t; ++i) { aTot += asin(lis[i] / r2); if(aTot > 1e-3) { break; } } return aTot; } T mooHalf() { T r2 = lis[0]; T del = 1e9; while(del > EPS) { if(evalDiff(r2 + del) < 0) { r2 += del; } del *= T(.5); } T r = r2 / T(2); T res = 0; for(int i = 0; i < t; ++i) { T s1 = lis[i] / T(2); T area = s1 * sqrt(sqr(r) - sqr(s1)); if(i == 0) { res -= area; } else { res += area; } } return res; } T mooFull() { T r2 = lis[0]; T del = 1e9; while(del > EPS) { if(evalSum(r2 + del) > PI + EPS) { r2 += del; } del *= T(.5); } T r = r2 / T(2); T res = 0; for(int i = 0; i < t; ++i) { T s1 = lis[i] / T(2); res += s1 * sqrt(sqr(r) - sqr(s1)); } return res; } T maxArea(int l, int r, double goal) { if(r - l <= 2) return 0; t = 0; for(int i = l; i < r; ++i) { lis[t++] = len[i]; } sort(lis, lis + t); for(int i = 0; i < t - 1 - i; ++i) { swap(lis[i], lis[t - 1 - i]); } T s = 0; for(int i = 1; i < t; ++i) { s += lis[i]; } if(s < lis[0] + EPS) { return 0; } s += lis[0]; T rad = s / PI / T(2.0); T maxEstimate = rad * rad * PI; //printf("%lf %lf\n", maxEstimate, goal); if(maxEstimate < goal - EPS) return 0; T res = 0; if(evalDiff(lis[0]) < EPS) { res = mooHalf(); } else { res = mooFull(); } //if(res > maxEstimate) printf("%lf %lf %lf\n", res, maxEstimate, s); return res; } int main() { int ct = 0; scanf("%d", &n); while(n) { ct++; for(int i = 0; i < n; ++i) { scanf("%lf", &len[i]); } //printf("%d\n", n); //printf("%lf\n", maxArea(0, n)); return 0; DP[0] = 0; for(int i = 1; i <= n; ++i) { DP[i] = 0; for(int j = 0; j < i; ++j) { double a = maxArea(j, i, DP[i] - DP[j]); DP[i] = max(DP[i], DP[j] + a); } } printf("Case %d: %0.10lf\n", ct, DP[n]); scanf("%d", &n); } return 0; }