牛客小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;
    }

 

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Joanh_Lan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值