「最大値と最小値の差」を最小化せよと言われたら、最大値または最小値を固定すると上手くいくことが多い!
問題概要
サイズが
これらの数列から 1 個ずつ要素を選んで
制約
考えたこと
愚直に全探索すると、
高速化したいと考えたとき、よく考えることは「ある変数の値を固定してみる」ということです。たとえば、数列
このように「最大値と最小値の差」を最小化したいという問題では、上を抑えるのと下を抑えるのと同時に考えないといけなくて困ることが多いですね。
そこで、「最大値」と「最小値」のうち、「最小値」を固定してしまうという解法が思い浮かびます。最小値
最小値を固定する
さて、4 つの数列から 1 個ずつ選んでできる 4 数の最小値として考えられる値は
- どの数列から選ぶか(4 通り)
- その数列のどの要素を選ぶか(
通り)
をかけ合わせて
そして、その最小値を
この値が最小となるような
全体として、
コード
#include <bits/stdc++.h> using namespace std; const long long INF = 1LL << 60; int main() { int N; cin >> N; vector<vector<long long>> A(4, vector<long long>(N)); for (int i = 0; i < 4; i++) { for (int j = 0; j < N; j++) cin >> A[i][j]; A[i].push_back(INF); sort(A[i].begin(), A[i].end()); } long long res = INF; for (int i = 0; i < 4; i++) { for (int j = 0; j < N; j++) { // 最小値が A[i][j] である場合 long long tmp = 0; for (int k = 0; k < 4; k++) { long long v = *lower_bound(A[k].begin(), A[k].end(), A[i][j]); tmp = max(tmp, v - A[i][j]); } res = min(res, tmp); } } cout << res << endl; }