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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laugh12321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值