Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Problem E:
HullMarathon

うさぎはフルマラソンという競技が好きである. この競技はチームで行う. チームメンバーは競技開始前に原点に集まる. 競技開始と同時に走り出し, 1 分後に立ち止まる．このとき，チームメンバーの位置の凸包の面積が最も大きなチームが勝ちとなる.

あなたは $N$ 匹のうさぎからなるチームの監督である. $i$ 匹目のうさぎは 1 分で $r_i$ 移動することができる. このチームが最適な戦略をとった場合の, 1 分後の凸包の面積の最大値を求めよ.

Constraints

$N$ will be between 3 and 8, inclusive.

$r_i$ will be an integer between 1 and 1,000, inclusive.

Input

入力は以下の形式で与えられる:

$N$

$r_1$

...

$r_N$

Output

凸包の面積の最大値を表す実数を 1 行に出力せよ. 小数点以下何桁出力してもよいが, 絶対誤差または相対誤差が $10^{-6}$ 以下のとき Accepted になる.

Sample Input 1

4
5
8
58
85

Sample Output 1

2970.000000000

Sample Input 2

6
1
1
1
1
1
1

Sample Output 2

2.598076211

Solution in C++11 (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
#define double long double
double PI = acos(-1);
double l[8];

double f(double t0,vector<double> L){
	double v = cos(t0) * L[0] * L[1];
	double sum = 0;
	for(int i = 0 ; i < L.size() - 1 ; i++){
		
		//cout << v / L[i] / L[i+1] << endl;
		sum += acos(v / L[i] / L[i+1]);
	}
	return sum;
}
double calc(double t0,vector<double> L){
	double v = cos(t0) * L[0] * L[1];
	double sum = 0;
	for(int i = 0 ; i < L.size() - 1 ; i++){
		sum += sin(acos(v / L[i] / L[i+1])) * L[i] * L[i+1] / 2.0;
	}
	return sum;
}
int main(){
	int N;
	cin >> N;
	for(int i = 0 ; i < N ; i++) cin >> l[i];
	
	double ans = 0;
	for(int i = 0 ; i < (1<<N) ; i++){
		vector<double> L;
		for(int j = 0 ; j < N ; j++)
			if( i >> j & 1 ) L.push_back(l[j]);
		if( L.size() < 3 ) continue;
		sort(L.begin(),L.end());
		do{
			L.push_back(L.front());
			
			double le = 0 , ri = PI;
			for(int k = 0 ; k < 128 ; k++){
				double mi = (le+ri) / 2.;
				if( f(mi,L) > 2 * PI ){
					ri = mi;
				}else{
					le = mi;
				}
			}
			ans = max(ans,calc(le,L));
			L.pop_back();
		}while(next_permutation(L.begin(),L.end()));
		// cout << L.size() << "|" <<  f(2*PI/6,L) << endl;
	}
	printf("%.10Lf\n",ans);
}