???:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
double a[15];
double dp[5][15];
bool isOk(double a, double b, double c)
{
if((a+b)>c && (a+c)>b && (b+c)>a)
return true;
return false;
}
double area(double a, double b, double c){
double x = (a+b+c)/2.0;
double s =sqrt(x*(x-a)*(x-b)*(x-c));
return s;
}
int main(){
int n;
while(~scanf("%d",&n)){
memset(dp,0,sizeof dp);
if(n == 0)
break;
for(int i = 0; i < n; i++)
scanf("%lf",&a[i]);
sort(a,a+n);
int m = n/3;
for(int i = 0; i < m; i++)
for(int j = 2; j < n; j++){
dp[i][j] = dp[i][j-1];
if(isOk(a[j-2],a[j-1],a[j]))
{
if(j != 2)
dp[i][j] = max(dp[i][j],(area(a[j-2],a[j-1],a[j]) + dp[i-1][j-3]));
else
dp[i][j] = area(a[j-2],a[j-1],a[j]);
}
}
printf("%.2lf\n",dp[m-1][n-1]);
}
return 0;
}贪心:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
double a[15];
double dp[5][15];
bool isOk(double a, double b, double c)
{
if((a+b)>c && (a+c)>b && (b+c)>a)
return true;
return false;
}
double area(double a, double b, double c){
double x = (a+b+c)/2.0;
double s =sqrt(x*(x-a)*(x-b)*(x-c));
return s;
}
int main(){
int n;
while(~scanf("%d",&n)){
memset(dp,0,sizeof dp);
if(n == 0)
break;
for(int i = 0; i < n; i++)
scanf("%lf",&a[i]);
sort(a,a+n);
double sum = 0.0;
for(int i = n-3; i >= 0; i--){
if(isOk(a[i],a[i+1],a[i+2])){
sum += area(a[i],a[i+1],a[i+2]);
i = i-2;
}
}
printf("%.2lf\n",sum);
}
return 0;
}
状态压缩不会 http://blog.youkuaiyun.com/yeyeyeguoguo/article/details/47859671
766

被折叠的 条评论
为什么被折叠?



