• 三角形牧场


    题目描述
    和所有人一样,奶牛喜欢变化。它们正在设想新造型的牧场。奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场。她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大。
    请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积。
    输入输出格式
    输入格式:
    第1行:一个整数N
    第2..N+1行:每行包含一个整数,即是木板长度。
    输出格式:
    仅一个整数:最大牧场面积乘以100然后舍尾的结果。如果无法构建,输出-1。
    输入输出样例
    输入样例#15
    1
    1
    3
    3
    4
    输出样例#1692
    说明
    样例解释:692=舍尾后的(100×三角形面积),此三角形为等边三角形,边长为4。
    题面

    感:许是我太笨拙,

    得不到期望结果,努力才会有收获,

    想想梦想的模样

    解题思路:

    1.

    用f[i][j]表示边长为(i,j,sum-j-k)的三角形是否可以构成

    尝试把每个木棍加到不同边中

    这样就可以背包了,

    2.贪心

    根据不等式的性质,a+b+c=S(S为定值),当a=b=c时,a*b*c最大

    S△=sqrt(p*(p-a)*(p-b)*(p-c))

    所以当三角形的三条边越接近,面积越大。

     1 #include<bits/stdc++.h>
     2 #define ll long long
     3 #define DB double
     4 using namespace std;
     5 const int N=50;
     6 int n,d[N],f[1000][1000],sum,ans;
     7 int get(int a,int b,int c)
     8 {
     9    if(!c || a+b<=c || b+c<=a || a+c<=b) return -1;
    10    DB p=(a+b+c)/2.0;
    11    return 100*sqrt(p*(p-a)*(p-b)*(p-c));
    12 }
    13 int main()
    14 {
    15     scanf("%d",&n);
    16     for(int i=1;i<=n;++i) scanf("%d",&d[i]),sum+=d[i];
    17     f[0][0]=1;ans=-9;
    18     for(int i=1;i<=n;++i)
    19      for(int j=sum;j>=0;--j)
    20       for(int k=sum;k>=0;--k)
    21       {
    22           if(j>=d[i]) f[j][k]=f[j][k] || f[j-d[i]][k];
    23           if(k>=d[i]) f[j][k]=f[j][k] || f[j][k-d[i]];
    24           if(f[j][k])ans=max(ans,get(j,k,sum-k-j));
    25       }
    26     printf("%d",ans);
    27     fclose(stdin);fclose(stdout);
    28     return 0;
    29 }
    KO
  • 相关阅读:
    2015年11月27日 野外生存(一)刀
    2015年11月26日 Java基础系列(五)异常Exception
    高斯混合模型(理论+opencv实现)
    K-means算法(理论+opencv实现)
    支持向量机(理论+opencv实现)
    《图像处理实例》 之 答题卡检测
    关于VS+ImageWatch在线调试问题
    关于W8.1不能安装VS2015(包括2017等)
    《图像处理实例》 之 车牌定位
    《opencv学习》 之 OTSU算法实现二值化
  • 原文地址:https://www.cnblogs.com/adelalove/p/8874793.html
Copyright © 2020-2023  润新知