挑战程序设计竞赛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\n", ans);
	 		break;
	 	}
	}
	if(!flag)
		printf("0\n");
	return 0;
}

  

posted @ 2020-01-09 19:45  funforever  阅读(334)  评论(0编辑  收藏  举报