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

    f[i][j]表示第一条边长度为i,第二条边长度为j的情况能否组出。  sum-i-j可以算出第三边。如果三条边可以组成三角形,则计算面积。

     1 /*by SilverN*/
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 #include<vector>
     8 using namespace std;
     9 const int mxn=100010;
    10 int read(){
    11     int x=0,f=1;char ch=getchar();
    12     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    13     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    14     return x*f;
    15 }
    16 double ss(double a,double b,double c){
    17     double p=(a+b+c)/2;
    18     return sqrt( p*(p-a)*(p-b)*(p-c) );
    19 }
    20 bool pd(int a,int b,int c){
    21     if(a<b)swap(a,b);
    22     if(a<c)swap(a,c);
    23     if(a<=b+c)return 1;
    24     return 0;
    25 }
    26 int n;
    27 int a[50];
    28 int smm=0;
    29 bool f[1610][1610];
    30 int main(){
    31     freopen("pasture.in","r",stdin);
    32     freopen("pasture.out","w",stdout);
    33     n=read();
    34     int k,i,j;
    35     for(i=1;i<=n;i++) a[i]=read(),smm+=a[i];
    36     int tmp=smm/2;
    37     f[0][0]=1;
    38     double ans=0.0;
    39     for(k=1;k<=n;k++){
    40         for(i=tmp;i>=0;--i)
    41          for(j=tmp;j>=0;--j){
    42              if(i>=a[k])f[i][j]|=f[i-a[k]][j];
    43             if(j>=a[k])f[i][j]|=f[i][j-a[k]];
    44              if(f[i][j] && pd(i,j,smm-i-j)){
    45                  ans=max(ans,ss(i,j,smm-i-j)*100);
    46              }
    47          }
    48     }
    49     if(ans==0)printf("-1
    ");
    50     else printf("%.0f
    ",floor(ans));
    51     return 0;
    52 }
  • 相关阅读:
    Java Mockito 笔记
    J2EE 练习题
    CXF 教程 (二)
    CXF 教程(一)
    Java 动态代理
    常用 Git 命令汇总
    JXL 简单示例
    Visual Studio 技巧
    TreeView双击节点而不改变节点的折叠/展开状态
    称3次,找出坏鸡蛋
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5989740.html
Copyright © 2011-2022 走看看