携程员工运动会场地问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 821 Accepted Submission(s): 231
Problem Description
携程每年要举行员工运动会,现在需要搭建三角形的场地给运动员们自由活动。 现在有N (3 <= N <= 40)个栅栏段(每个栅栏长度Li (1 <= Li <= 40)),必须刚好用掉所有的栅栏拼成一个最大面积的三角形活动区域, 求这个最大面积。
Input
* 第一行: 整数 N ,表示有多少个栅栏 * 第 2..N+1行: 共N 行, 每行中包括一个整数, 表示 一个栅栏的长度.( 多个栅栏的长度可以出现相同). * 第N+3行:第二组数据。 每组数据隔一空行,文件末尾以0结尾。
Output
每行输出一个截取后的整数,即最大面积乘以100后的整数。 如果无法构成,输出 -1。
Sample Input
5 1 1 3 3 4 5 12 37 1 4 3 0
Sample Output
692 -1这道题WA了两次,原来是“ 如果无法构成,输出 -1”,,没有处理好。。。。#include<stdio.h> #include<string.h> #include<math.h> const int N =801; bool dp[N][N];//dp[i][j]表示取两边分别为i,j可达 int x[N]; int main() { int n; while(scanf("%d",&n)!=EOF&&n) { int i,j,k; int sum =0; for(i=0;i<n;i++) { scanf("%d",&x[i]); sum+=x[i]; } memset(dp,false,sizeof(dp)); dp[0][0]=true; int half = sum>>1; for(i=0;i<n;i++) for(j=half;j>=0;j--) for(k=j;k>=0;k--) { if(x[i]<=j) dp[j][k]|=dp[j-x[i]][k]; if(k>=x[i]) dp[j][k]|=dp[j][k-x[i]]; } double ha = sum/2.0; double ans =-1; for(i=0;i<half;i++) for(j=0;j<=i;j++) { if(dp[i][j]) { k=sum-i-j; if(i+j>k&&i+k>j&&k+j>i) { double temp = ha*(ha-i)*(ha-j)*(ha-k); if(temp>ans)ans=temp; } } } int out; if(ans<0)out=-1; else out= (int)(sqrt(ans)*100); printf("%d\n",out); } return 0; }