zoukankan      html  css  js  c++  java
  • luogu 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 j k 表示一条边为j一条边为k

    推出所有可能状态,检验该状态是否能构成三角形

    能的话计算返回面积,否则返回-1;

    注意ans初值设为-1

    #include<cmath>
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int a[56];
    int n,sum;
    double dp[1607][1607];
    double calc(int a,int b,int c)
    {
        if(c==0||a+b<=c||b+c<=a||a+c<=b)return -1;
        double len=(a+b+c)/2.0;
        return (double)100*sqrt(len*(len-a)*(len-b)*(len-c));
    }
    int main()
    {
        int n;scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",a+i),sum+=a[i];
        double ans=-1.0;
        dp[0][0]=1;
        for(int i=1;i<=n;i++)
        {
            for(int j=sum;j>=0;j--)
                for(int k=sum;k>=0;k--)
                {
                    if(j>=a[i])
                        if(dp[j-a[i]][k])dp[j][k]=1;
                    if(k>=a[i])
                        if(dp[j][k-a[i]])dp[j][k]=1;
                    if(i==n&&j&&k&&dp[j][k])
                        ans=max(ans,calc(j,k,sum-j-k));
                }
        }
        printf("%d
    ",int(ans));
        return 0;
    }
  • 相关阅读:
    VirtualBox安装
    记一次修改fstab挂载参数
    Debian其实有提供附带了各种桌面的安装镜像
    记一次使用unzip命令
    记一次给iPhone 6越狱
    浅谈.Net中内置的一种特殊的引用类型 -- String类型
    .Net中的静态类和非静态类、静态成员和非静态成员
    .Net子窗体给父窗体传值的几种方法
    int、float、double In .Net之相互转换
    车厢重组
  • 原文地址:https://www.cnblogs.com/sssy/p/7107056.html
Copyright © 2011-2022 走看看