牛客小bai月赛43——C 木棍游戏(DFS)

题目如下:

来源:牛客网
 

题目描述

给出 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;
    }

 

最后,感谢您的阅读!!!

Guess you like

Origin blog.csdn.net/m0_60593173/article/details/122501267