首页 > 代码库 > 洛谷P1284 三角形牧场

洛谷P1284 三角形牧场

 

题目描述

和所有人一样,奶牛喜欢变化。它们正在设想新造型的牧场。奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场。她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大。

请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积。

输入输出格式

输入格式:

 

第1行:一个整数N

第2..N+1行:每行包含一个整数,即是木板长度。

 

输出格式:

 

仅一个整数:最大牧场面积乘以100然后舍尾的结果。如果无法构建,输出-1。

 

输入输出样例

输入样例#1:
511334
输出样例#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\n");50     else printf("%.0f\n",floor(ans));51     return 0;52 }

 

洛谷P1284 三角形牧场