いろいろがんばりたいブログ

情報科学科の人がいろいろ書きます。

蟻本(プログラミングコンテストチャレンジブック)の三角形のやつ

O(nlogn)解法
方針として、まずはソートする。
ソート後のVectorをVとすると、もし、V[i]をもっとも長い辺とした三角形が存在するならば、
V[i-1],V[i-2]を残りの辺にすればよい。
なぜなら、今ほしいのはもっとも周囲が長い三角形であり、
またV[i-1],V[i-2]はV[i]以下の最大の辺二つなので、これでダメだったら残りでもダメ。
これをi >= 2に関してくりかえせばよい。

#include <iostream>
#include <algorithm>
#include <vector>

#define all(con) (con).begin(),(con).end()

using namespace std;
int main(){
    int n;
    cin >> n;
    vector<int> V(n);
    for(int i=0;i<n;i++) cin >> V[i];

    sort(all(V));
    int maxi = 0;
    for(int i=2;i<n;i++){
        if(V[i] < V[i-1] + V[i-2]){
            maxi = max(maxi,V[i] + V[i-1] + V[i-2]);
        }
    }
    cout << maxi << endl;
    return 0;
}