木棒三角形问题

木棒三角形问题

问题描述

小A家里有很多长度不一样的木棍,有一天他很无聊,便摆弄这些木棒来解闷。小A的数学学得很好,所以他想在这些木棒中挑选3根来组成一个直角三角形,当然他可能有很多种选法,但他想挑选出一个面积最大的直角三角形。
输入:
输入有多组,每组输入包括2行,第1行输入一个n(0 ≤ \leq n ≤ \leq 100),表示小A有n根木棍,接着一行有n个整数(n ≤ \leq 1000),表示木棍的长度(长度从小到大给出)。
输出:
输出面积最大的直角三角形的面积,且保留3位小数,如果不能组成直角三角形,则输出“My Good!”。
样例输入:
4
1 2 3 4
5
2 3 4 5 6
6
3 4 5 6 8 10
2
1 1
样例输出:
My Good!
6.000
24.000
My Good!

解题思路

看到题目很容易想到,如果能知道把从n根木棍中选出3根的所有情况的解,那么答案就出来了。
现在主要的问题是怎么用程序来枚举所有的情况,已知直角三角形的3条边中斜边是最长的,题目给出了一个“长度从小到大给出”的条件,这样可以依次枚举三角形中长度最短,第二长和最长的边,具体实现见以下代码。

参考代码

#include 
#include 
int main()
{
	int i, j, k;
	double ans;
	int n;
	int len[110];
	while(scanf("%d", &n) != EOF) {
		for(i = 1; i <= n; i++)
			scanf("%d", &len[i]);                      //存储木棍长度
		ans = -1;
		for(i = 1; i <= n; i++) { 						//枚举最短木棍
			for(j = i + 1; j <= n; j++) {              //枚举第二长的木棍
				for(k = j + 1; k <= n; k++) {        //枚举第三长的木棍
					if(len[i] * len[i] + len[j] * len[j] == len[k] * len[k]) {  //如果是直角三角形
						if(0.5 * len[i] * len[j] > ans)    //取最优解
							ans = 0.5 * len[i] * len[j];
						}
					}
				}
			}
			if(ans == -1)
				printf("My Good!");
			else
				printf("%.3lf\n", ans);
		}
	}
	

你可能感兴趣的:(算法)