• 洛谷1284三角形牧场


    题目描述

    和所有人一样,奶牛喜欢变化。它们正在设想新造型的牧场。奶牛建筑师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。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<algorithm>
     5 using namespace std;
     6 int i,j,k,N,a[45],q,tot = 0;
     7 bool f[805][805];
     8 double ans = -1,an;
     9 double mainji(double i,double j,double k)
    10 {
    11     double p;
    12     p = (i + j + k)  / 2;
    13     return sqrt(p * (p -i) * (p - j) * (p - k));
    14 }
    15 int main()
    16 {
    17     scanf("%d",&N);
    18     for(i = 1;i <= N;i++)
    19     {
    20         scanf("%d",&a[i]);
    21         tot += a[i];
    22     }
    23     q = (tot + 1) / 2;
    24     f[0][0] = true;
    25     for(i = 1;i <= N;i++) //枚举每一块板子 
    26     {
    27         for(j = q;j >= 0;j--)//一条边的最大长度为q-1,因为两边之和大于第三边可证出来 
    28         {
    29             for(k = j;k >= 0;k--) //假设第二条边比第一条边小 
    30             {
    31                 if((j >= a[i] && f[j - a[i]][k] == true) || (k >= a[i] && f[j][k - a[i]] == true ))//判断放之前可不可能成立 
    32                 {
    33                     f[j][k] = true;//先判断是否能组成一条边为j一条边为k的木棒 
    34                 }
    35             }
    36         }
    37     }
    38     for(i = q;i >= 1;i--)
    39     {
    40         for(j = i;j >= 1;j--)
    41         {
    42             k = tot - i - j; //确定第三条边的长度 
    43             if(i + j > k && i + k > j && j + k > i && f[i][j] == true)//判断他是否是个三角形,并且判断i和j能不能摆出来 
    44             {
    45                 an = mainji(i,j,k);
    46                 if(ans < an)
    47                 ans = an;
    48             }
    49         }
    50     }
    51     if(ans == -1)
    52     printf("-1");
    53     else
    54     printf("%d",(int)(ans * 100));
    55     return 0;
    56 }

    **这道题我调了一个半小时,海伦公式那块最好写分函数,不写。我是过不去了,还有判断j >= a[i] && f[j - a[i]][k] == true) || (k >= a[i] && f[j][k - a[i]] == true这块注意前后顺序,否则容易RE

    ****最后对于他是一个背包题深感惊讶

  • 相关阅读:
    PAT 1037. 在霍格沃茨找零钱(20)
    PAT 1036. 跟奥巴马一起编程(15)
    Topcoder SRM633 DIV2 解题报告
    HDU 4565 So Easy! 矩阵快速幂 + 共轭数
    HDU 2256 Problem of Precision 矩阵快速幂 + 共轭数
    FZU 1683 纪念SlingShot 矩阵快速幂
    CodeForces 185A Plant 矩阵快速幂
    HDU 2604 Queuing 矩阵快速幂
    HDU 1575 Tr A 矩阵快速幂
    HDU 1757 A Simple Math Problem 矩阵快速幂
  • 原文地址:https://www.cnblogs.com/rax-/p/9894540.html
Copyright © 2020-2023  润新知