3524 - F. 火柴三角形

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

丁丁平时希望收集火柴,今天他突然心血来潮用这些火柴拼起了三角形,他想找出其中三根火柴拼出一个面积最大的三角形,请你帮帮他。


题目输入

输入包含多组测试数据不超过50组,每组数组第一行是一个正数N (<100),接着是N个正数,表示N根火柴的长度,每根长度小于100000

题目输出

对于每组输入,输出最大的三角形的面积,保持2位小数,如果那组火柴拼不出一个三角形,则输出no triangle

输入/输出样例

输入格式

3
1 9 10
4
1 1 1 1
3
3 4 5

输出格式

no triangle
0.43
6.00

C语言解答

#include <stdio.h>
#include <math.h>
double getArea(int a, int b, int c)
{
	int temp = a + b + c;
	double sum = temp;
	temp = a + b - c;
	if(temp <= 0)
		return 0;
	sum *= temp;
	temp = a + c - b;
	if(temp <= 0)
		return 0;
	sum *= temp;
	temp = b + c - a;
	if(temp <= 0)
		return 0;
	sum *= temp;
	
	return sqrt(sum) / 4;
}
int main()
{
	int N;
	int *length;
	int i, j, z;
	double areaMax, temp;
	while(scanf("%d", &N) == 1)
	{
		areaMax = 0;
		length = (int*)malloc(sizeof(int) * N);
		for(i = 0; i < N; i++)
			scanf("%d", length+i);
		for(i = 0; i < N - 2; i++)
		{
			for(j = i + 1; j < N - 1; j++)
			{
				for(z = j + 1; z < N; z++)
				{
					temp = getArea(length[i], length[j], length[z]);
					if(temp > areaMax)
						areaMax = temp;
				}
			}
		}
		if(areaMax == 0)
			printf("no triangle\n");
		else
			printf("%.2f\n", areaMax);
	}
	return 0;
}

C++解答

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
#include <iomanip>
using namespace std;


double CalcArea(int a, int b, int c)
{
	double area = -1;
	if ((a + b > c) && (a + c > b) && (b + c > a))
	{
		double  p = (a + b + c) / 2.0;
		area = p * (p - a) * (p - b)*(p - c);
		area = sqrt(area);
	}
	return area;
}

double Process(vector<int> &v)
{
	if (v.size() <= 2)
		return -1;

	int a, b, c;
	double maxArea = -1, area;
	for (int i = 0; i < v.size() - 2; i++)
	{
		a = v[i];
		for (int j = i + 1; j < v.size() - 1; j++)
		{
			b = v[j];
			for (int k = j + 1; k < v.size(); k++)
			{
				c = v[k];
				area = CalcArea(a, b, c);
				if (area == -1)
					break;

				if (area > maxArea)
					maxArea = area;
			}
		}
	}
	return maxArea;

}
int main()
{
	int n, a;
	double area;
	vector<int> v;
	while (cin >> n)
	{
		v.clear();
		v.reserve(n);

		while (n--)
		{
			cin >> a;
			v.push_back(a);
			sort(v.begin(), v.end());//按边长排序
		}
		area = Process(v);
		if (area == -1)
			//cout << "no triangle" << endl;
			printf("no triangle\n");
		else
			printf("%.2lf\n", area);
		//cout <<setiosflags(ios::fixed)<<setprecision(2) << area << endl;

	}
	return 0;
}

Java解答

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner in = new Scanner(System.in);
		while(in.hasNext()){
			int n = in.nextInt();
			int[] match = new int[n];
			for(int i = 0; i < n; i++){
				match[i] = in.nextInt();
			}
			boolean found = false;
			int i = 0;
			int k = 0;
			int l = 0;
			double p = 0;
			double result = 0;
            double area = 0;
			for(int a = 0; a < n - 2; a++){
				for(int b = a + 1; b < n - 1; b++){
					for(int c = b + 1; c < n; c++){
						i = match[a];
						k = match[b];
						l = match[c];
						if(!isTriangle(i, k, l)){
							continue;
                        }
						else{
							found = true;
							p = (i + k + l) * 1.0 / 2;
							area = Math.sqrt(p * (p - i) * (p - k) * (p - l));
							if(area > result)
								result = area;
						}
					}
				}
			}
			if(found)
				System.out.printf("%.2f\n", result);
			else
				System.out.println("no triangle");
		}
	}
	public static boolean isTriangle(double a, double b, double c){
		if(a + b > c && a + c > b && b + c > a)
			return true;
		else
			return false;
	}
}