C++で形成可能なチーム数を数えるアルゴリズム
n人の兵士が一列に並んでおり、それぞれの兵士には固有の評価値(rating)が割り当てられているとします。この中から、以下のルールに従って3人の兵士で構成されるチームを作ります。
インデックス (i, j, k) の3人の兵士を選び、その評価値が (rating[i], rating[j], rating[k]) であるとします。
チームが有効とみなされる条件は次のいずれかです。
- (rating[i] < rating[j] < rating[k]) — 評価値が昇順に並ぶ場合
- (rating[i] > rating[j] > rating[k]) — 評価値が降順に並ぶ場合
このとき、 formationできる有効なチームの総数を求めます(1人の兵士は複数のチームに所属できます)。
例えば、入力が rating = [2,5,3,4,1] の場合、(2,3,4)、(5,4,1)、(5,3,1) の3つのチームが作れるため、出力は 3 となります。
解法のアプローチ
この問題は、考えられるすべての組み合わせ (i, j, k) を三重ループで調べる全探索によって解くことができます。手順は以下の通りです。
- 答えを格納する変数 ret := 0、配列サイズ n := v.size() で初期化します。
- i を 0 から n-1 まで、j を i+1 から n-1 まで、k を j+1 から n-1 まで繰り返します。
- v[i] < v[j] かつ v[j] < v[k](昇順)の場合、ret を1増やします。
- そうでなく、v[i] > v[j] かつ v[j] > v[k](降順)の場合も、ret を1増やします。
- すべての組み合わせを確認したら、ret を返します。
実装例
理解を深めるために、以下のC++による実装を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int numTeams(vector<int>& v) {
int ret = 0;
int n = v.size();
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
for (int k = j + 1; k < n; k++) {
if (v[i] < v[j] && v[j] < v[k])
ret++;
else if (v[i] > v[j] && v[j] > v[k])
ret++;
}
}
}
return ret;
}
};
main(){
Solution ob;
vector<int> v = {2,5,3,4,1};
cout << (ob.numTeams(v));
}
入力
{2,5,3,4,1}
出力
3
計算量について
この手法では3つのインデックスのすべての組み合わせを調べるため、時間計算量は O(n³)、空間計算量は O(1) となります。兵士の数 n が小さい場合は十分実用的ですが、n が大きくなる場合は、中央の要素 j ごとに「左側で自分より小さい・大きい要素の数」を数えることで O(n²) に改善する方法もあります。
-
C++で五胞体数(ペンタトープ数)を求める方法
五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の
-
【C++】長方形に含まれる正方形の総数を求めるアルゴリズムと実装
縦の長さL、横の幅B(L≥B)の長方形が与えられたとします。この記事では、L×Bの長方形の中にいくつの正方形が含まれているかを効率的に求める方法を解説します。 上の図は3×2の長方形の例です。この長方形には、2×2の正方形が2個、1×1の正方形が6個含まれています。 合計:6+2=8個 規則性を見つける まず、正方形だけで構成されたB×Bの図形について考えてみましょう。 サイズL×Bの長方形には、必ずL×B個の1×1の正方形が含まれます。 含まれる最大の正方形のサイズはB×Bです。 L=B=1の場合:正方形の数=1 L=B=2の場合:正方形の数=1+4=5(2×2が1個、1×1が4個) L