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