公式

C - King's Summit 解説 by cn449


まず、最終的に全員が集まるマスを固定したときの問題を考えます。

全員がマス \((R, C)\) に集まる時刻として考えられる最小値は \(\displaystyle\max_{i = 1, 2, \ldots, N}( \max(|R-R_i|, |C-C_i|))\) です。これは、各人がマス \((R, C)\) にいない限り、\(1\) 回の移動で \( \max(|R-R_i|, |C-C_i|)\)\(1\) 小さくできることができ、また \(2\) 以上小さくできることはないことからわかります。

\(R_i\) の最大値、最小値を \(R_{max}, R_{min}\)\(C_i\) の最大値、最小値を \(C_{max}, C_{min}\) とすると\(\displaystyle\max_{i = 1, 2, \ldots, N}( \max(|R-R_i|, |C-C_i|)) = \max(|R - R_{max}|, |R-R_{min}|, |C-C_{max}|, |C-C_{min}|)\) です。

したがって、\(1 \leq R, C \leq 10^9\) を満たす整数 \(R, C\) について \(\max(|R - R_{max}|, |R-R_{min}|, |C-C_{max}|, |C-C_{min}|)\) の最小値が本問題の答えとなります。

この値を求めるには \(\max(|R - R_{max}|, |R-R_{min}|)\) の最小値および \(\max(|C-C_{max}|, |C-C_{min}|)\) の最小値をそれぞれ求めればよく、これは \(R = \lfloor\frac{R_{max} + R_{min}}{2}\rfloor, C = \lfloor\frac{C_{max} + C_{min}}{2}\rfloor\) が最小値を与える \(R, C\) (の \(1\) つ)となります。

また、具体的な \(\max(|R - R_{max}|, |R-R_{min}|)\) の最小値は \(\lceil\frac{R_{max} - R_{min}}{2}\rceil\)\(\max(|C - C_{max}|, |C-C_{min}|)\) の最小値は \(\lceil\frac{C_{max} - C_{min}}{2}\rceil\) となります。

実装例

#include <bits/stdc++.h>
using namespace std;

int main() {
	int n;
	cin >> n;
	vector<int> x(n), y(n);
	for (int i = 0; i < n; i++) cin >> x[i] >> y[i];
	int X = *max_element(x.begin(), x.end()) - *min_element(x.begin(), x.end());
	int Y = *max_element(y.begin(), y.end()) - *min_element(y.begin(), y.end());
	int ans = (max(X, Y) + 1) / 2;
	cout << ans << '\n';
}

投稿日時:
最終更新: