木棒三角形问题
问题描述
小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 <stdio.h>
#include <stdlib.h>
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);
}
}