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

  

 

转载于:https://www.cnblogs.com/tenlee/p/4873140.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值