《挑战程序设计竞赛》1.6.1-先从简单题开始
输入:
n = 5 n = 4
a = {2, 3, 4, 5, 10} a = {4, 5, 10, 20}
输出:
12(选择3、4、5时) 0(无论怎么选都无法组成三角形)
选择3根棍子,它们能组成三角形的充要条件为 :
长棍子的长度 < 其余两根棍子的长度之和。
于是我们可以试想这样一种算法:首先用三重循环枚举所有的棍子选择方案,再利用上式判断能 否组成三角形。如果可以,那么该三角形的周长就是备选答案。
于是我们可以试想这样一种算法:首先用三重循环枚举所有的棍子选择方案,再利用上式判断能 否组成三角形。如果可以,那么该三角形的周长就是备选答案。
#include <stdio.h>
#define MAX_N 100
#define max(a,b) (((a) > (b)) ? (a) : (b))
int main(void)
{
int n, a[MAX_N];
int ans = 0; // 答案
scanf("%d", &n);
for (int l = 0; l < n; l++)
scanf("%d", &a[l]);
// 让i < j < k,这样棍子就不会被重复选中了
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
for (int k = j + 1; k < n; k++) {
int len = a[i] + a[j] + a[k]; // 周长
int ma = max(a[i], max(a[j], a[k])); // 最长棍子的长度
int rest= len - ma; // 其余两根棍子的长度之和
if (ma < rest)
// 可以组成三角形,如果可以更新答案则更新
ans = max(ans, len);
}
}
}
// 输出
printf("%d\n", ans);
return 0;
}