NC231992. 木棍游戏
描述
给出 根长度不一的木棍,第 根棍子长度为 。两根长度分别为 和 的木棍可以拼接成一根长度为 的木棍,同理 根, 根,甚至 根都能拼接。
问:使用这 根木棍作三角形的边(一根木棍至多使用一次,也可以不使用),能拼出的面积最大的三角形的面积。
输入描述
第一行包含一个整数 ,表示木棍的数量。
第二行包含 个整数,用空格隔开,表示 根木棍的分别长度 其中 。
输出描述
输出一行,表示能拼出来的最大三角形的面积,结果保留一位小数。如果无法拼出三角形,输出。
示例1
输入:
3 3 4 5
输出:
6.0
示例2
输入:
3 3 4 7
输出:
-1
C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 436K, 提交时间: 2023-06-03 13:05:38
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m[10]; double ans=-1; void dfs(ll a,ll b,ll c,ll u){ if(u>n){ if(a+b>c&&a+c>b&&b+c>a){ double p=(a+b+c)/2.0; double s=sqrt(p*(p-a)*(p-b)*(p-c)); ans=max(ans,s); } return; } dfs(a,b,c,u+1); dfs(a+m[u],b,c,u+1); dfs(a,b+m[u],c,u+1); dfs(a,b,c+m[u],u+1); } int main(){ cin>>n; for(ll i=1;i<=n;i++)cin>>m[i]; dfs(0,0,0,1); printf("%.1lf",ans); }
C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 520K, 提交时间: 2023-04-14 14:37:17
#include<bits/stdc++.h> using namespace std; int n,m[10]; double a,b,c,ans=-1; void dfs(int u){ if(u>n){ if(a+b<=c||a+c<=b||b+c<=a) return; double p=(a+b+c)/2.0; double s=sqrt(p*(p-a)*(p-b)*(p-c)); ans=max(ans,s); return; } dfs(u+1); a+=m[u]; dfs(u+1); a-=m[u],b+=m[u]; dfs(u+1); b-=m[u],c+=m[u]; dfs(u+1); c-=m[u]; } int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>m[i]; dfs(1); printf("%.1lf",ans); }