《挑战程序设计竞赛》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;
} 


阅读更多
文章标签: 算法
个人分类: 算法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭