XDOJ1274 - 可怜的lpx

Description

可怜的lpx终于在别人的帮助下追上了aqx,可是他那瘦弱的身体想要去强行从aqx那里抢回烟那是不可能的。aqx看着可怜的lpx实在不忍心继续欺负他,便随手扔出来一堆长短不一的木棍,让lpx从中挑出来三根木棍,组成一个三角形,如果这个三角形的周长最大,那么aqx将把烟还给lpx。哎,可怜的lpx。。。

Input

多组数据,每组数据一个n(5<= n <=10^6),代表有n根木棍。
接下来n个整数Xi,代表第i根木棍的长为Xi (1<=Xi<=10^6)。

Output

能组成最大的三角形周长(保证有解)

Sample Input

4
1 2 3 4

Sample Output

9

解题思路:

三角的三条边要满足:

(1)任意两条边之和大于第三边

(2)任意两条边之差小于第三边

这里设一个三角形的三条边分别为X,Y,Z;且X>=Y>=Z

显然X>Y-Z,  X+Y>Z, X+Z>Y 是成立的,如果X<Y+Z的话:

X-Y<Z,  X-Z<Y

所以我们要做的就是把所有的边从大到小排序,然后从另最大的边作为X,如果次大的边为Y,再次大的边为Z,如果X<Y+Z,就输出X+Y+Z;否则X=Y,Y=Z,Z为下一个次大的边

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

bool bigComp(const int& r1,const int& r2)
{
    return r1>r2;
}

int main()
{
    vector<int> X;
    vector<int>::iterator iter;
    int n;
    while(cin>>n)
    {
        X.clear();
        for(int i=0;i<n;++i)
        {
            int t;
            cin>>t;
            X.push_back(t);
        }
        sort(X.begin(),X.end(),bigComp);
        for(iter=X.begin();iter!=X.end()-2;++iter)
        {
            if(*iter<*(iter+1)+*(iter+2))
            {
                cout<<*iter+*(iter+1)+*(iter+2)<<endl;
                break;
            }
        }
    }
    return 0;
}

 

最后欢迎大家访问我的个人网站: 1024s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值