2014 Yandex.Algorithm Elimination Stage, Round1 C - Non-Convex Quadrilaterals
問題概要
n 個の整数が与えられる.それらから4つ選んで,四角形の4辺の長さとする.
もちろん選び方によっては四角形が作れないが,そういう選び方は出来ないものとする.
こうしてできる四角形のうち,凹四角形であるもののなかで,周の長さが最も大きいものの値はなにか?
・制約
1 <= n <= 10^4
1 <= a_i <= 10^8
解法
実際に四角形を書けばすぐわかるが,ほとんどの四角形はいい感じに変形すると,
おなじ4辺をもつ凹四角形に変形できる.
したがって,基本的に四角形が作れるならそれは凹四角形にできるから,数字の大きい方から4つ選んでいって,実際に四角形を構築できるか考えれば十分である.
四角形が構築できる条件は,4つの辺のうちの最大の長さが他の3辺の長さの和未満であることである.
コーナーケースが1つあり,それは正方形である.これはどう変形しても凹四角形にできない.
計算量はソートの分で O(nlogn).
ソースコード
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; vector<int> a(n); for(int i = 0; i < n; ++i) { cin >> a[i]; } sort(rbegin(a), rend(a)); int ans = -1; for(int i = 0; i + 3 < n; ++i) { if(a[i] == a[i + 1] && a[i] == a[i + 2] && a[i] == a[i + 3]) continue; // square int sum = 0; for(int j = i + 1; j <= i + 3; ++j) { sum += a[j]; } if(sum > a[i]) { ans = a[i] + sum; break; } } cout << ans << endl; }