洛谷P1284 三角形牧场

题目描述

和所有人一样,奶牛喜欢变化。它们正在设想新造型的牧场。奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场。她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大。

请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积。

输入输出格式

输入格式:

第1行:一个整数N

第2..N+1行:每行包含一个整数,即是木板长度。

输出格式:

仅一个整数:最大牧场面积乘以100然后舍尾的结果。如果无法构建,输出-1。

输入输出样例

输入样例#1:
5
1
1
3
3
4
输出样例#1:
692

说明

样例解释:692=舍尾后的(100×三角形面积),此三角形为等边三角形,边长为4。

————————————————————我是分割线————————————————————————

dp题目,用dp[i][j][k]表示前i块木板是否能拼成j、k长度,即可。

记得用海伦公式

 /*
Problem:
OJ:
User: S.B.S.
Time:
Memory:
Length:
*/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<iomanip>
#include<cassert>
#include<climits>
#include<functional>
#include<bitset>
#include<vector>
#include<list>
#define F(i,j,k) for(int i=j;i<=k;++i)
#define M(a,b) memset(a,b,sizeof(a))
#define FF(i,j,k) for(int i=j;i>=k;i--)
#define maxn 10001
#define inf 0x3f3f3f3f
#define maxm 4001
#define mod 998244353
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m;
bool dp[][];
int d[];
int sum=;
double ans=-1.0;
inline double solve(int a,int b,int c)
{
if(c==||a+b<=c||b+c<=a||a+c<=b) return -;
double p=(a+b+c)/2.0;
return *sqrt(p*fabs(p-a)*fabs(p-b)*fabs(p-c));
}
int main()
{
std::ios::sync_with_stdio(false);//cout<<setiosflags(ios::fixed)<<setprecision(1)<<y;
ifdef LOCAL freopen("pasture.in","r",stdin);
freopen("pasture.out","w",stdout);
#endif
cin>>n;
F(i,,n) cin>>d[i],sum+=d[i];
F(i,,n) dp[][]=true;
F(k,,n)FF(i,sum,)FF(j,sum,){
if(i>=d[k]) dp[i][j]=dp[i][j]||dp[i-d[k]][j];
if(j>=d[k]) dp[i][j]=dp[i][j]||dp[i][j-d[k]];
if(k==n&&i&&j&&dp[i][j]) ans=max(ans,solve(i,j,sum-i-j));
}
cout<<(int)(ans)<<endl;
return ;
}
上一篇:linux搭建邮件服务器


下一篇:P1284 三角形牧场