列表

详情


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);
}

上一题