挑战程序设计竞赛——1.6.1三角形

Posted jacobfun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛——1.6.1三角形相关的知识,希望对你有一定的参考价值。

题目:
        有n根棍子,棍子i的长度为ai。想要从中选出三根棍子组成周长尽可能长的三角形。请输出最大的周长,若无法组成三角形则输出0。

限制条件

3 ≤ n ≤ 100

1 ≤ ai ≤ 10^6
输入

n = 5

a = {2,3,4,5,10}

输出

12(选择3、4、5时)

输入

n = 4

a = {4,5,10,20}

输出

0(无论怎么选都无法组成三角形)

 

这道题大家都知道O(n3)的方法,但是还有一种方法可以以O(nlogn)解决,那就是排序。

从大到小进行排序,从最大开始计算使得连续3个数,看是否能构成三角形,第一个能构成三角形的解就是我们要的解。

为什么呢?

因为如果三个数不连续,即存在e + d > a那么对b + c必定大于a(因为b + c > e + d),所以如果找到最大的连续三条边,那么就是我们想要的答案。

 代码:

#include <bits/stdc++.h>
using namespace std;
int a[105];
bool flag;
bool cmp (int x, int y)
{
	return x > y;
}
int main(void)
{
	int n;
	scanf("%d", &n);
	for(int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]); 
	}
	sort(a, a + n, cmp);
	for(int i = 0; i < n - 2; i++)
	{
	 	if(a[i] < a[i + 1] + a[i + 2])
	 	{
	 		flag = true;
	 		int ans = a[i] + a[i + 1] + a[i + 2];
	 		printf("%d
", ans);
	 		break;
	 	}
	}
	if(!flag)
		printf("0
");
	return 0;
}

  

以上是关于挑战程序设计竞赛——1.6.1三角形的主要内容,如果未能解决你的问题,请参考以下文章

挑战程序设计竞赛-1.6节-三角形

挑战程序设计竞赛准备篇---三角形(贪心)

第1章蓄势待发准备篇

《挑战程序设计竞赛》课后练习题解集——2.3 记录结果再利用的“动态规划”

Poj2919 Crane

挑战程序设计竞赛(第2版)的目录