输入
n = 5
a = {2,3,4,5,10}
输出
12(选择3、4、5时)
输入
n = 4
a = {4,5,10,20}
输出
0(无论怎么选都无法组成三角形)
挑战程序设计竞赛书中给了O(n^3)解法,进行排序后再比较可实现O(nlogn)
定义一个数组nums[N]从下标0开始存。
思路:题目要求能成三角形的最长周长,我们给所有给定的边进行排序后,从最长的一条边(nums[n-1])开始,判断nums[n-1]与(nums[n-2]+nums[n-3])的大小,如果不能构成三角形,那么就放弃这条最长边,用nums[n-2]重复比较(因为排过序了,所以如果nums[n-1]>(nums[n-2]+nums[n-3]) 则 nums[n-1]一定大于前面任意两边和)。当第一次找到能构成三角形的三条边的时候,就是最长周长边。
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n,maxx;//定义输入数据个数,和最长周长
int nums[N];//存放边的数组
int main()
{
cin>>n;
for(int i=0;i<n;i++){
cin>>nums[i];
}
sort(nums,nums+n);//排序
for(int i=n-1;i>=0;i--){
if(nums[i]<nums[i-1]+nums[i-2]){
maxx = nums[i]+nums[i-1]+nums[i-2];
cout<<maxx<<endl;//找到符合的三条边,就将周长输出,并return 0 ;结束运行
return 0;
}
}
cout<<maxx<<endl;//没找到,就输出0;
return 0;
}