zoukankan      html  css  js  c++  java
  • 洛谷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

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

  • 相关阅读:
    es5预览本地文件、es6练习代码演示案例
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 836 矩形重叠(暴力)
    Subversion under Linux [Reprint]
    Subversion how[Reprint]
  • 原文地址:https://www.cnblogs.com/rax-/p/9894540.html
Copyright © 2011-2022 走看看