题目链接:
题目大意:
给一堆 木棍,用这些木棍组成三角形,要组成的所有的三角形的面积和最大,不一定要用完所有的木棍。
样例解释:
3 //三个棍子
1 1 20 // 每个棍子的长度,自然,这三个棍子不可能组成三角形,故输出 0.00
7 // 7个棍子
3 4 5 3 4 5 90 // 组成两个三角形(3, 3 4)和(4, 4, 5),面积和即为13.64
0 // 输出 0 退出
解题思路:
本来不想写题解的,因为太水了,,,,,,,
可是看到 谷歌搜出来的 都是用动态规划,啊啊啊啊啊啊,一道水题,用得着动态规划吗,杀鸡用牛刀啊(其实我不太懂动态规划 |||||||)
直接排序, 尽量 大和大的结合,不能结合就依次向下找
代码:
//Author LJH
//www.cnblogs.com/tenlee
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#define clc(a, b) memset(a, b, sizeof(a))
#define LL long long
using namespace std;
const int inf = 0x3f;
const int INF = 0x3f3f3f3f;
const int maxn = 20;
const double eps = 1e-6;
int n, ha[maxn];
double ver[maxn];
inline double getArea(double a, double b, double c)
{
//printf("a = %.0lf, b = %.0lf, c = %.0lf\n", a, b, c);
double p = (a + b + c) / 2.0;
double area = sqrt(p * (p - a) * (p - b) * (p - c));//海伦公式,求三角形面积
return area;
}
bool cmp(double a, double b)
{
return a > b;
}
int main()
{
while(~scanf("%d", &n) && n)
{
clc(ha, 0);
for(int i = 1; i <= n; i++)
{
scanf("%lf", &ver[i]);
}
sort(ver+1, ver+n+1, cmp);
/*for(int i = 1; i <= n; i++)
printf("%.0lf\n", ver[i]);*/
int j = 2, k = 1;
double sum = 0;
/解决思路
while(j <= n)
{
if(ver[j] - ver[j-1]/2 > eps)
{
k++;
}
else
{
k = 1;
}
if(k == 3)
{
k = 0;
sum += getArea(ver[j], ver[j-1], ver[j-2]);
}
j++;
}
printf("%.2lf\n", sum);
}
return 0;
}