蟻本(プログラミングコンテストチャレンジブック)の三角形のやつ
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; }