三角形

在这里插入图片描述
输入
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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值