C++プログラムで偵察ユニットを編成できる兵士のペア(インデックス)を見つける方法
問題概要
n個の要素を持つ配列Aがあり、n人の兵士が円形に並んでいるとします。i番目の兵士の身長はA[i]で表されます。偵察ユニットは、隣り合う2人の兵士のうち、身長差が最も小さいペアで編成されます。身長の近い2人が並ぶことで、お互いに目立ちにくくなるためです。この記事では、偵察ユニットを編成できる兵士のペアのインデックスを求めるC++プログラムを紹介します。
例えば、入力が A = [10, 12, 13, 15, 10] の場合、出力は (5, 1) となります。これは、5番目の兵士(身長10)と1番目の兵士(身長10)が円の上で隣り合っており、身長差が0と最小であるためです。
解法のステップ
兵士は円形に並んでいるため、最初の兵士と最後の兵士も隣り合っている点に注意が必要です。以下の手順に従うことで、最適なペアを見つけられます。
- n を配列Aのサイズとします。
- D を、最初と最後の兵士の身長差 |A[0] − A[n−1]| で初期化します。
- H を n で初期化します。
- i を 1 から n−1 まで繰り返します。もし D > |A[i] − A[i−1]| であれば、D を |A[i] − A[i−1]| に、H を i に更新します。
- 最後に H と (H mod n) + 1 を出力します。
C++での実装例
理解を深めるために、以下の実装例を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
void solve(vector<int> A) {
int n = A.size();
int D = abs(A[0] - A[n - 1]);
int H = n;
for (int i = 1; i < n; i++) {
if (D > abs(A[i] - A[i - 1])) {
D = abs(A[i] - A[i - 1]);
H = i;
}
}
cout << H << ", " << (H % n) + 1;
}
int main() {
vector<int> A = { 10, 12, 13, 15, 10 };
solve(A);
}
入力
{ 10, 12, 13, 15, 10 }出力
5, 1
計算量について
このアルゴリズムは配列を一度だけ走査するため、時間計算量はO(n)、追加の記憶領域はO(1)と非常に効率的です。兵士の人数が多くなっても高速に動作するのが特徴です。
-
C++で2つの数の最大公約数(GCD)を求めるプログラム
最大公約数(GCD)とは最大公約数(GCD: Greatest Common Divisor)とは、2つの整数をどちらも割り切る正の整数のうち、最も大きい数のことです。プログラミングの基礎的なアルゴリズム問題としてよく取り上げられるテーマであり、分数の約分や暗号処理など、さまざまな場面で活用されます。例として、45と27という2つの数を考えてみましょう。45 = 5 × 3 × 327 = 3 × 3 × 3両方の数に共通する素因数は「3 × 3」であるため、45と27の最大公約数は9となります。方法1:ユークリッドの互除法による実装2つの数の最大公約数を求める最も効率的な方法が「ユークリッド
-
C++で階乗を求めるプログラム|再帰・非再帰の2つの実装方法を解説
非負整数 n の階乗とは、n 以下のすべての正の整数を掛け合わせた積のことです。たとえば、5 の階乗は次のように計算されます。5! = 5 × 4 × 3 × 2 × 1 5! = 120整数の階乗は、再帰的なプログラムまたは非再帰的なプログラムのいずれかで求めることができます。ここでは、両方の実装例をサンプルコードとともに紹介します。 方法1:非再帰プログラム(forループ)で階乗を求める 最もシンプルな方法は、for ループを使って 1 から n まで順番に掛け合わせていく方法です。以下のプログラムでその実装を見てみましょう。 サンプルコード #include <iostream&g