Triangular Pastures
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 7088 | Accepted: 2317 |
Description
Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The old rectangular shapes are out of favor; new geometries are the favorite.
I. M. Hei, the lead cow pasture architect, is in charge of creating a triangular pasture surrounded by nice white fence rails. She is supplied with N (3 <= N <= 40) fence segments (each of integer length Li (1 <= Li <= 40) and must arrange them into a triangular pasture with the largest grazing area. Ms. Hei must use all the rails to create three sides of non-zero length.
Help Ms. Hei convince the rest of the herd that plenty of grazing land will be available.Calculate the largest area that may be enclosed with a supplied set of fence segments.
I. M. Hei, the lead cow pasture architect, is in charge of creating a triangular pasture surrounded by nice white fence rails. She is supplied with N (3 <= N <= 40) fence segments (each of integer length Li (1 <= Li <= 40) and must arrange them into a triangular pasture with the largest grazing area. Ms. Hei must use all the rails to create three sides of non-zero length.
Help Ms. Hei convince the rest of the herd that plenty of grazing land will be available.Calculate the largest area that may be enclosed with a supplied set of fence segments.
Input
* Line 1: A single integer N
* Lines 2..N+1: N lines, each with a single integer representing one fence segment's length. The lengths are not necessarily unique.
* Lines 2..N+1: N lines, each with a single integer representing one fence segment's length. The lengths are not necessarily unique.
Output
A single line with the integer that is the truncated integer representation of the largest possible enclosed area multiplied by 100. Output -1 if no triangle of positive area may be constructed.
Sample Input
5 1 1 3 3 4
Sample Output
692
给出n条边,输出这n条边组成三角形的面积的最大值*100。数据范围是边数不大于40,每条边长度不大于40。所以我们可以尝试可不可以暴力求解。首先定义一个数组dp,dp[i][j]表示三角形一条边长为i,一条边长为j的情况存不存在。那么状态转移方程就是dp[j][k]|=(dp[j-e[i]][k]||dp[j][k-e[i]]),表示j或k是否可以由原来的边加上某条边得到。若由j,k,(sum-j-k)形成的三角形存在,计算出所有的最大值。
#include<stack>
#include<queue>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#pragma commment(linker,"/STACK: 102400000 102400000")
#define lson a,b,l,mid,cur<<1
#define rson a,b,mid+1,r,cur<<1|1
using namespace std;
typedef long long LL;
const double eps=1e-6;
const int MAXN=50;
int e[MAXN],n;
double sum;
bool dp[MAXN*MAXN/2][MAXN*MAXN/2];//由于每条三角形每条边长不会大于周长的一半,所以只需要开一个800*800的数组
int main()
{
while(scanf("%d",&n)!=EOF)
{
sum=0;
memset(dp,false,sizeof(dp));
for(int i=0; i<n; i++)
{
scanf("%d",&e[i]);
sum+=e[i];
}
double p=sum/2;
dp[0][0]=true;
int ans=-1;
for(int i=0; i<n; i++)
for(int j=800; j>=0; j--)//每条三角形每条边长不会大于周长的一半
for(int k=j; k>=0; k--)
{
if(j>=e[i])
dp[j][k]|=dp[j-e[i]][k];
if(k>=e[i])
dp[j][k]|=dp[j][k-e[i]];
if(dp[j][k])
{
int m=sum-j-k;
if((j+k)>m&&(j+m)>k&&(m+k)>j)
ans=max(ans,(int)((sqrt(p*(p-j)*(p-k)*(p-m)))*100));
}
}
printf("%d\n",ans);
}
return 0;
}