度度熊拼三角
Accepts: 2536
Submissions: 4433
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Problem Description
度度熊有 NN 根木棒,每根木棒的长度为a_iai。
现在要挑选其中的三根,问能拼出的三角形的最大周长是多少。
如果不能拼成任何一个三角形,输出 -1−1。
Input
多组数据(不超过1010组),读到EOF结束。
对于每一组数据:
第一行一个数 NN 表示木棒数量。
第二行一共 NN 个数,描述每一根木棒的长度。
1 leq N leq 10001≤N≤1000
木棒长度都是不超过100000100000的正整数
Output
对于每一组数据,输出一个数表示答案。
Sample Input
3 1 1 100 7 1 9 9 90 2 2 4
Sample Output
-1 22
分析:要使周长最大,肯定是组成的三边尽量大,排序所有边,从大到小枚举,第一个满足条件的三边即所求
AC代码:
#include <map> #include <set> #include <stack> #include <cmath> #include <queue> #include <cstdio> #include <vector> #include <string> #include <bitset> #include <cstring> #include <iomanip> #include <iostream> #include <algorithm> #define ls (r<<1) #define rs (r<<1|1) #define debug(a) cout << #a << " " << a << endl using namespace std; typedef long long ll; const ll maxn = 1e6+10; const ll mod = 998244353; const double pi = acos(-1.0); const double eps = 1e-8; ll n, a[1010]; bool cmp( ll p, ll q ) { return p > q; } bool ok( ll x, ll y, ll z ) { if( x+y <= z || x+z <= y || y+z <= x ) { return false; } return true; } int main() { ios::sync_with_stdio(0); while( cin >> n ) { memset(a,0,sizeof(a)); for( ll i = 0; i < n; i ++ ) { cin >> a[i]; } if( n < 3 ) { cout << -1 << endl; continue; } sort(a,a+n,cmp); ll num = -1; for( ll i = 2; i < n; i ++ ) { if( ok(a[i],a[i-1],a[i-2]) ) { num = a[i]+a[i-1]+a[i-2]; break; } } cout << num << endl; } return 0; }