题目如下:
来源:牛客网
题目描述
给出 n 根长度不一的木棍,第 iii 根棍子长度为 ai 。两根长度分别为 Ab 和Ac 的木棍可以拼接成一根长度为Ab+Ac 的木棍,同理 3 根, 4 根,甚至 n 根都能拼接。
问:使用这 n 根木棍作三角形的边(一根木棍至多使用一次,也可以不使用),能拼出的面积最大的三角形的面积。
输入描述:
第一行包含一个整数 n (3≤n≤8),表示木棍的数量。
第二行包含 n 个整数,用空格隔开,表示 n 根木棍的分别长度 a1,a2,...,an其中 1≤ai≤1e3。
输出描述:
输出一行,表示能拼出来的最大三角形的面积,结果保留一位小数。如果无法拼出三角形,输出−1。示例1
输入
3
3 4 5
3 3 4 5输出
6.0
示例2
输入
3
3 4 7
输出
-1
AC代码如下:
#include<bits/stdc++.h>
using namespace std;
int vis[10];
double ans;
int num[10];
int n;
bool check(int a[]){
if(a[1]+a[2]<=a[3]||a[2]+a[3]<=a[1]||a[1]+a[3]<=a[2])
return 0;
return 1;
}
double dis(int a[]){
double p = (a[1]+a[2]+a[3])/2;
return sqrt(p*(p-a[1])*(p-a[2])*(p-a[3]));
}
void dfs(int now,int a[],int f,int sum){
if(f==4)
{
if(check(a))
ans = max(ans,dis(a));
return;
}
if(now==n+1){
if(sum==0)
return;
a[f] = sum;
dfs(1,a,f+1,0);
return;
}
dfs(now+1,a,f,sum);
if(!vis[now]){
vis[now] = 1;
dfs(now+1,a,f,sum+num[now]);
vis[now] = 0;
}
}
int main()
{
cin>>n;
int a[4] = {0};
for(int i = 1;i<=n;++i)
cin>>num[i];
dfs(1,a,1,0);
if(ans<0.0000001)
cout<<-1<<endl;
else printf("%.1lf",ans);
return 0;
}
题解:
观察到n只有8,dfs爆搜即可 实际只有2^20次方根本超不了
使用海伦公式求三角形的面积:
注意:
要先判断三边是否可以构成三角形
bool check(int a[]){
if(a[1]+a[2]<=a[3]||a[2]+a[3]<=a[1]||a[1]+a[3]<=a[2])
return 0;
return 1;
}
再求其面积 并 存储最大面积
double dis(int a[]){
double p = (a[1]+a[2]+a[3])/2;
return sqrt(p*(p-a[1])*(p-a[2])*(p-a[3]));
}
if(f==4)
{
if(check(a))
ans = max(ans,dis(a));
return;
}
最后,感谢您的阅读!!!