HihoCoder 1245:王胖浩与三角形 三角形边长与面积

#1245 : 王胖浩与三角形

时间限制:1000ms
单点时限:1000ms
内存限制:256MB

描述

王胖浩有一个三角形,三边长为a,b,c。他有特殊的能力,能增加三条边的边长,增加的总长度不能超过l。

他想通过合理地使用他的特殊能力,使得三角形的面积最大。

输入

第一行一个整数T,表示测试数据个数。

以下T行,每行一个四个整数a,b,c,l。

数据范围:

1<=T<=104, 1<=a,b,c<=106, 0<=l<=106

输出

输出T行,每行一个实数,表示三角形的面积。要求相对误差不能超过10-9

样例输入
1
2 3 3 3
样例输出
5.8216152143
已知三角形的三个边长a,b,c,其面积是sqrt((a+b+c)*(a+b-c)*(a+c-b)*(b+c-a))/4。

考虑面积公式sqrt((a+b+c)(a+b-c)(b+c-a)(a+c-b))/4,如果固定了a和b+c,那么b和c越接近越好。

所以将三条边排序,首先增加第一条边到和第二条边一样长,然后一起增加前两条边到和第三条边一样长,然后三条边一起增加。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std;

double a[5], res, ll;

int main()
{
	//freopen("i.txt","r",stdin);
	//freopen("o.txt","w",stdout);

	int test;
	scanf("%d", &test);

	while (test--)
	{
		cin >> a[0] >> a[1] >> a[2] >> ll;
		
		sort(a, a + 3);

		if (ll <= a[1] - a[0])
		{
			a[0] = a[0] + ll;
		}
		else
		{
			ll = ll - (a[1] - a[0]);
			a[0] = a[1];
			if (ll/2 <= a[2] - a[1])
			{
				a[1] = a[1] + ll / 2;
				a[0] = a[0] + ll / 2;
			}
			else
			{
				ll = ll - 2 * (a[2] - a[1]);
				a[1] = a[2];
				a[0] = a[2];

				a[0] = a[0] + ll / 3;
				a[1] = a[1] + ll / 3;
				a[2] = a[2] + ll / 3;
			}
		}
		res = sqrt((a[0] + a[1] + a[2])*(a[0] + a[1] - a[2])*(a[1] + a[2] - a[0])*(a[0] + a[2] - a[1])) / 4;
		printf("%.10lf\n", res);
	}
	//system("pause");
	return 0;
}




posted on 2015-11-02 00:12  光速小子  阅读(239)  评论(0编辑  收藏  举报

导航