C++で解く!レーティングが重複しないチームメンバーのインデックス列を見つけるプログラム
要素数 n の配列 A と数値 k が与えられたとします。クラスには n 人の生徒がおり、i 番目の生徒のレーティングは A[i] で表されます。ここで、「全メンバーのレーティングが互いに異なる」という条件を満たす k 人のチームを編成することを目標とします。編成が不可能な場合は「Impossible」を返し、可能な場合は選んだ生徒のインデックス列を返してください。
例えば、入力が A = [15, 13, 15, 15, 12]、k = 3 の場合、出力は [1, 2, 5] となります。これは、1番目・2番目・5番目の生徒のレーティングがそれぞれ 15・13・12 であり、互いに重複していないためです。
解法のアプローチ
この問題は、配列を先頭から走査し、「そのレーティングの値がまだ一度も現れていない」要素だけを選んでいくことで解けます。具体的な考え方は以下の通りです。
- 各レーティングの出現済みフラグを管理する配列 app を用意します。
- 選択した生徒のインデックスを格納する配列 ans を用意します。
- 先頭から順に走査し、初めて登場するレーティングを持つ要素のインデックスを ans に記録していきます。
- 最終的に記録できた人数(重複なしの人数)が k 以上であれば、ans の先頭から k 個を出力します。k 未満であれば、十分な人数を集められないため「Impossible」となります。
アルゴリズムの手順
この問題を解くために、以下のステップに従います。
app と ans という2つの大きな配列を定義し、0で初期化する
cnt := 0
n := A のサイズ
i := 1 から n まで、i を1ずつ増やしながら繰り返す:
a := A[i - 1]
もし app[a] が 0 ならば:
app[a] を1増やす
cnt を1増やす
ans[cnt] := i
もし cnt >= k ならば:
i := 1 から k まで、i を1ずつ増やしながら繰り返す:
ans[i] を出力する
そうでなければ:
「Impossible」を返すC++による実装例
理解を深めるために、以下の実装例を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
void solve(vector<int> A, int k) {
int app[101] = { 0 }, ans[101] = { 0 }, cnt = 0;
int n = A.size();
for (int i = 1; i <= n; i++) {
int a = A[i - 1];
if (!app[a]) {
app[a]++;
ans[++cnt] = i;
}
}
if (cnt >= k) {
for (int i = 1; i <= k; i++)
cout << ans[i] << ", ";
}
else
cout << "Impossible";
}
int main() {
vector<int> A = { 15, 13, 15, 15, 12 };
int k = 3;
solve(A, k);
}入力
{ 15, 13, 15, 15, 12 }, 3出力
1, 2, 5,
計算量と注意点
このアルゴリズムは配列を一度走査するだけでよいため、時間計算量は O(n)、空間計算量は固定サイズの補助配列を使用する O(1) となります。
ただし、この実装では補助配列のサイズを101としているため、レーティングの値が 1 以上 100 以下であることが前提となっています。レーティングの範囲がそれより広い場合は、配列の代わりに unordered_set や map などの連想コンテナを使うことで、任意の整数値に対応できるようになります。
-
C++で三角形の重心を求めるプログラムの作成方法
この記事では、三角形の3つの頂点の座標を格納した2次元配列が与えられたときに、その三角形の重心を求めるC++プログラムの作成方法を解説します。 三角形の重心とは、三角形の3本の中線がすべて交わる点のことです。 また、三角形の中線とは、ある頂点と、その対辺(向かい合う辺)の中点を結ぶ線分のことを指します。 それでは、具体的な例を使って問題を確認してみましょう。 入力 (-3, 1), (1.5, 0), (-3, -4) 出力 (-1.5, -1) 説明 重心 (x, y) = ((-3 + 1.5 - 3) / 3, (1 + 0 - 4) / 3) = (-1.5, -1) 解法のアプロ
-
C++で平行四辺形の面積を求めるプログラムの作成方法
この記事では、平行四辺形の底辺と高さを表す2つの値が与えられたとき、C++を使ってその面積を求めるプログラムを作成する方法を解説します。 平行四辺形とは? 平行四辺形とは、4つの辺からなる閉じた図形であり、向かい合う2組の辺がそれぞれ長さが等しく、互いに平行になっている四角形のことです。 問題を理解するための具体例 入力 B = 20, H = 15 出力 300 説明 平行四辺形の面積 = 底辺 × 高さ = 20 × 15 = 300 解決アプローチ この問題を解くには、平行四辺形の面積を求める幾何学の公式を使用します。 面積 = 底辺 × 高さ つまり、与えられた底辺と高さを掛け合わせ