原题链接:登录—专业IT笔试面试备考平台_牛客网
思路:拿n个边组成三角形的3条边
因为n的值很小=8,所以我们可以用二进制枚举来枚举选到的所有状态
三条边分别进行二进制枚举
枚举到一条边的时候我们要判断他用到的木棍是否和前面列举的有重复的
如果有的话就跳过
最后算出三条不重复的边之后,我们判断一下是不是能构成三角形
如果能构成的话就用三角形的面积方程:
已知三条边abc:
P=周长的一半
S=sqrt(p*(p-a)*(p-b)*(p-c))
算出面积取最大就行了
/*
.----------------. .----------------. .----------------. .----------------.
| .--------------. || .--------------. || .--------------. || .--------------. |
| | ________ | || | _________ | || | ____ ____ | || | ____ | |
| | |_ ___ `. | || | |_ ___ | | || ||_ \ / _|| || | .' `. | |
| | | | `. \ | || | | |_ \_| | || | | \/ | | || | / .--. \ | |
| | | | | | | || | | _| _ | || | | |\ /| | | || | | | | | | |
| | _| |___.' / | || | _| |___/ | | || | _| |_\/_| |_ | || | \ `--' / | |
| | |________.' | || | |_________| | || ||_____||_____|| || | `.____.' | |
| | | || | | || | | || | | |
| '--------------' || '--------------' || '--------------' || '--------------' |
'----------------' '----------------' '----------------' '----------------'
*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<deque>
#include<cmath>
#include<stack>
#define int long long
#define lowbit(x) x&(-x)
#define PI 3.1415926535
#define endl "\n"
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int gcd(int a,int b) {
return b? gcd(b,a%b):a;
}
/*
int dx[8]={-2,-2,-1,1,2,2,-1,1};
int dy[8]={-1,1,2,2,1,-1,-2,-2};
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};
int dx[8]={-1,1,0,0,-1,-1,1,1};
int dy[8]={0,0,-1,1,-1,1,-1,1};
*/
//int e[N],ne[N],h[N],idx,w[N];
/*void add(int a,int b,int c){
e[idx]=b;
w[idx]=c;
ne[idx]=h[a];
h[a]=idx++;
}
*/
const int N=10;
int n;
int d[N];
int sum(int x){
int res=0;
for(int i=0;i<n;i++){
if((x>>i)&1)res+=d[i];
}
return res;
}
bool cheek(int x,int y,int z){
if(x<y)swap(x,y);
if(x<z)swap(x,z);
if(y<z)swap(y,z);
if(y+z>x)return true;
else return false;
}
void sove(){
cin>>n;
double ans=-1;
for(int i=0;i<n;i++)cin>>d[i];
for(int i=0;i<(1<<n);i++){
int a=sum(i);
for(int j=0;j<(1<<n);j++){
if(i&j)continue;
int b=sum(j);
for(int k=0;k<(1<<n);k++){
if(i&k||j&k)continue;
int c=sum(k);
if(cheek(a,b,c)){
double p=(a+b+c)*1.0/2;
double op=sqrt(p*(p-a)*(p-b)*(p-c));
ans=max(ans,op);
}
}
}
}
if(ans!=-1)printf("%.1f",ans);
else printf("-1");
}
signed main(){
int t=1;
// cin>>t;
while(t--){
sove();
}
return 0;
}