洛谷1284 三角形牧场

题目描述

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

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

第1行:一个整数N

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

输出格式:

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

用dfs(i,x,y,z)表示用完了长度小于等于i的木条,三边长度分别为x,y,z。保存每个长度的木条有几根,再规定x>=y>=z,再加上判重,速度就很快了。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int a[45],n,mx;
bool vis[45][1600][800];
double ans=-1;
double S(int x,int y,int z)
{
    if (x>y+z||y>x+z||z>x+y) return -1;
    double p=(double)(x+y+z)/2;
    return sqrt(p*(p-x)*(p-y)*(p-z));
}
void dfs(int p,int x,int y,int z)
{
    int i,j;
    if (p>mx)
    {
        ans=max(ans,S(x,y,z));
        return;
    }
    if (x<y) swap(x,y);
    if (x<z) swap(x,z);
    if (y<z) swap(y,z);
    if (vis[p][x][y]) return;
    vis[p][x][y]=1;
    for (i=0;i<=a[p];i++)
      for (j=0;i+j<=a[p];j++)
        dfs(p+1,x+i*p,y+j*p,z+(a[p]-i-j)*p);
}
int main()
{
    int i,j,k,p,q,x,y,z;
    scanf("%d",&n);
    for (i=1;i<=n;i++)
    {
        scanf("%d",&x);
        mx=max(x,mx);
        a[x]++;
    }
    dfs(1,0,0,0);
    if (ans<0) printf("-1\n");
    else printf("%d\n",(int)(ans*100));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值