Triangular Pastures POJ - 1948
2024-09-07 20:44:37
Triangular Pastures POJ - 1948
sum表示木条的总长。a[i]表示第i根木条长度。ans[i][j][k]表示用前i条木条,摆成两条长度分别为j和k的边是否可能。
那么ans[i][j][k]=ans[i-1][j-a[i]][k] || ans[i-1][j][k-a[i]]
可以用滚动数组优化。
最后在ans[n]中枚举i和j,如果ans[n][i][j]为true,再算出sum-i-j的长度,判断是否存在分别以i,j,sum-i-j为三边长的三角形。如果存在,再用海伦公式算出三角形面积,用面积去更新最大面积。
错误记录:
没有在dp的时候判边界,也就是没有判j>=a[i]和k>=a[i]。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
bool ans[][];
LL a[],n,sum;
double p,anss;
int main()
{
LL i,j,k,x,y,z;
scanf("%lld",&n);
for(i=;i<=n;i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
ans[][]=;
for(i=;i<=n;i++)
for(j=sum;j>=;j--)
for(k=sum;k>=;k--)
{
if(j>=a[i])
ans[j][k]|=ans[j-a[i]][k];
if(k>=a[i])
ans[j][k]|=ans[j][k-a[i]];
}
for(x=;x<=sum;x++)
for(y=x;y<=sum-x-;y++)
{
if(!ans[x][y]) continue;
z=sum-x-y;
if(y>z) break;
if(x+y<=z) continue;
p=(double)(x+y+z)/2.0;
anss=max(anss,sqrt(p*(p-x)*(p-y)*(p-z)));
}
if(anss!=0.0)
printf("%lld",(long long)(anss*(double)));
else
printf("-1");
return ;
}
最新文章
- MySQL源码分析:源码文件结构及主要数据结构
- 用Javascript取float型小数点
- jqGrid学习笔记(二)
- yeild
- Parsing HTML with C++ (using Qt preferably) - Stack Overflow
- 【Python】Python 基础知识
- IOS本地日志记录方案
- vue的一些坑(第一天)
- 使用SQL 提示优化sql
- Java开源生鲜电商平台-异常模块的设计与架构(源码可下载)
- 大数据处理N!(21<;N<;2000)
- Golang的md5 hash计算
- 记录一次php连接mssql的配置
- NLP笔记:词向量和语言模型
- 第二章 flex输入输出结构
- 怎样从外网访问内网Jetty?
- P3959 宝藏
- webshell文件下载器
- Windows下安装Oracle12C(二)
- javascript使用jQuery加载CSV文件+ajax关闭异步