首页 > 代码库 > luogu P1284 三角形牧场
luogu 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 j k 表示一条边为j一条边为k
推出所有可能状态,检验该状态是否能构成三角形
能的话计算返回面积,否则返回-1;
注意ans初值设为-1
#include<cmath>#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int a[56];int n,sum;double dp[1607][1607];double calc(int a,int b,int c){ if(c==0||a+b<=c||b+c<=a||a+c<=b)return -1; double len=(a+b+c)/2.0; return (double)100*sqrt(len*(len-a)*(len-b)*(len-c));}int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",a+i),sum+=a[i]; double ans=-1.0; dp[0][0]=1; for(int i=1;i<=n;i++) { for(int j=sum;j>=0;j--) for(int k=sum;k>=0;k--) { if(j>=a[i]) if(dp[j-a[i]][k])dp[j][k]=1; if(k>=a[i]) if(dp[j][k-a[i]])dp[j][k]=1; if(i==n&&j&&k&&dp[j][k]) ans=max(ans,calc(j,k,sum-j-k)); } } printf("%d\n",int(ans)); return 0;}
luogu P1284 三角形牧场
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。