x回のスワップ後に2人のライバル学生間の最大距離を求めるC++プログラム
4つの数値 n、x、a、b が与えられているとします。一列に並んだ n 人の学生がおり、その中に2人のライバル関係にある学生がいます。1人は位置 a に、もう1人は位置 b にいます。位置は左から右へ 1 から n まで番号が付けられています。この2人の学生の間の距離を最大化したいと考えています。次の操作を x 回まで実行できます。隣り合う2人の学生を選んで入れ替えるというものです。x 回のスワップ後に実現可能な最大距離を求める必要があります。
例えば、入力が n = 5、x = 1、a = 3、b = 2 の場合、出力は 2 になります。これは、位置 3 と位置 4 の学生を入れ替えることで、2人の学生間の距離が |4 − 2| = 2 になるためです。
解法のアプローチ
この問題は非常にシンプルな計算で解くことができます。考え方のポイントは次のとおりです。
- 1回のスワップで距離は最大 1 ずつ増やせます。したがって、x 回のスワップで距離は最大 |a − b| + x まで伸ばせます。
- しかし、距離には物理的な上限があります。列の両端に2人が到達した場合の最大距離は n − 1 です。
以上をまとめると、答えは次の式で求められます。
min(|a - b| + x, n - 1)
つまり、「スワップで伸ばせる距離」と「列の構造上の最大距離」のうち、小さい方を採用します。
実装例
以下にC++による実装を示します。
#include <bits/stdc++.h>
using namespace std;
int solve(int n, int x, int a, int b) {
return min(abs(a - b) + x, n - 1);
}
int main() {
int n = 5;
int x = 1;
int a = 3;
int b = 2;
cout << solve(n, x, a, b) << endl;
}入力
5, 1, 3, 2
出力
2
計算量
この解法は単純な算術演算のみで構成されているため、時間計算量は O(1)、追加のメモリ使用量も O(1) で済みます。入力サイズが大きくなっても高速に動作するのが特徴です。
-
C++で二分木の2つのノード間の距離を求めるプログラムの作成方法
この記事では、二分木(バイナリツリー)と木の中の2つのノードが与えられたときに、それらのノード間の距離を求めるC++プログラムの作成方法を解説します。問題の概要ここでいう「2つのノード間の距離」とは、一方のノードからもう一方のノードへ移動する際に通過する辺(エッジ)の最小本数のことを指します。具体例を挙げて、問題を確認してみましょう。入力二分木Node1 = 3、Node2 = 5出力3出力の解説ノード3からノード5までの経路は「3 → 1 → 2 → 5」です。この経路で通過する辺は3本であるため、2つのノード間の距離は3となります。解法のアプローチこの問題に対する基本的な解法は、最小共通祖
-
C++で各都市から最寄り駅までの最大距離を求めるアルゴリズム
概要 0からN-1までの番号が付けられたN個の都市と、駅が設置されている都市のリストが与えられたとき、「任意の都市からその最寄り駅までの距離」の最大値を求めるのが本課題です。なお、駅のある都市は任意の順序で与えられる点に注意してください。 入力例 numOfCities = 6, stations = [2, 4] 出力 2 入力例 numOfCities = 6, stations = [4] 出力 4 1つ目の例では、6つの都市が存在し、駅がある都市が緑色で強調表示されています。この場合、最寄り駅から最も遠いのは都市0で、その距離は2です。したがって、最大距離は2となります。