题解 | #木棍游戏#

木棍游戏

https://ac.nowcoder.com/acm/problem/231992

这道题我第一反应是用贪心去写,无奈贪了半天都没有贪出来,所以只能用dfs暴力过题

数学知识:海伦公式链接:https://baike.baidu.com/item/%E6%B5%B7%E4%BC%A6%E5%85%AC%E5%BC%8F/106956

思路就是dfs每个面积暴力比对,选出最大的就行

注:呜呜呜,在那个不加边的情况上debug了好久

#include<cmath>
#include<algorithm>
using namespace std;
const int N=10;

int n;
int f[N];
float res=-1;
float S(int a,int b,int c)//海伦公式
{
    float p=(a+b+c)/2.0;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}
void dfs(int a,int b,int c,int u)
{
    if(u>n)return;
    if(a+b>c&&a+c>b&&b+c>a)
        res=max(res,S(a,b,c));
    
    dfs(a+f[u],b,c,u+1);//第一条边加上现有的边
    dfs(a,b+f[u],c,u+1);//第二条边加上现有的边
    dfs(a,b,c+f[u],u+1);//第三条边加上现有的边
    dfs(a,b,c,u+1);//不加,有可能加了还小了,也可能加了不合法了
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",&f[i]);
    
    dfs(0,0,0,0);
    printf("%.1f",res);
    return 0;
}
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务