TopCoderOpen 2016 round 1A Medium: EllysSocks
最大の最小みたいな問題はにぶたん。 mediumにしては簡単だった。
問題
整数の列$S$が与えられる。$S$の項を使って$P$個の整数の対を作る。 そのような対の集まり$X = \{ (a_i,b_i) | 0 \le i \lt P \}$に関して、対を成す数の差の最大値$D_X = \max_i | a_i - b_i |$を考え、この最小値$\min_X D_X$を答えよ。
解法
二分探索。その述語はsortして貪欲。
実装
off-by-oneのあたりはサンプルが通るように適当に合わせた。
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
class EllysSocks { public: int getDifference(vector<int> S, int P); };
int EllysSocks::getDifference(vector<int> s, int p) {
sort(s.begin(), s.end());
ll low = 0, high = 10000000001;
while (low + 1 < high) {
ll mid = (low + high) / 2;
int cnt = 0;
int prv = -1;
for (int it : s) {
if (prv != -1 and (it - prv) < mid) {
cnt += 1;
prv = -1;
} else {
prv = it;
}
}
(p <= cnt ? high : low) = mid;
}
return low;
}