HDU 5135 Little Zu Chongzhi's Triangles(简单水题)

题目链接:

戳我

题目大意:

给一堆 木棍,用这些木棍组成三角形,要组成的所有的三角形的面积和最大,不一定要用完所有的木棍。

样例解释:

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;
}

  

 

posted @ 2015-10-12 22:46  豪气干云  阅读(251)  评论(0编辑  收藏  举报