C++で解く:銀行の金庫から回収できる紙幣の最大枚数を求めるアルゴリズム
3つの整数 k、l、m と、n 個の要素を持つ配列 A が与えられているとします。ある強盗が銀行強盗に失敗しましたが、銀行内のすべての金庫を開けることには成功していました。そこへ別の人物が現れ、この失敗した強盗に便乗して、金庫からお金を盗み出そうと考えます。
金庫は一列に並んでおり、すべての金庫には合計で n 枚の紙幣が残っています。i 番目の紙幣は A[i] 番目の金庫の中にあります。現在、銀行の従業員は k 番目の金庫におり、警備員は2名配置されています。1人目の警備員は l(l < k)番目の金庫、すなわち従業員の左側を警備しており、もう1人の警備員は m(m > k)番目の金庫、すなわち右側を警備しています。2人の警備員は一切動きません。
この人物は毎秒ごとに、「現在いる金庫の紙幣をすべて回収する」か「隣接する金庫へ移動する」のいずれかの行動を選択できます。ただし、窃盗の容疑をかけられるリスクがあるため、警備員が見張っている金庫には決して立ち入ることができません。この条件下で、この人物が集められる紙幣の最大枚数を求めるのが本問題です。
たとえば、k = 5、l = 3、m = 7、A = [4, 7, 5, 5, 3, 6, 2, 8] という入力の場合、出力は 4 になります。これは、2人の警備員の間(4番目〜6番目の金庫)に存在する紙幣がちょうど4枚であるためです。
解法のステップ
この問題を解くために、以下の手順に従います。
- カウンター c1 を 0 で初期化します。
- 配列 A の各要素 x について、「x が l より大きく、かつ m より小さい」という条件を満たす場合に c1 を1増やします。
- 最終的な c1 の値を結果として返します。
ここでのポイントは、警備員が動かないため、2人の警備員の間にある金庫(l < x < m)にはいつでも自由にアクセスできるという点です。したがって、複雑なシミュレーションは不要で、その範囲内に存在する紙幣を単純に数え上げるだけで答えが得られます。
c1 := 0
n := size of A
c1 := 0
for initialize i := 0, when i < n, update (increase i by 1), do:
x := A[i]
if x > l and x < m, then:
(increase c1 by 1)
return c1
C++による実装例
理解を深めるために、以下の実装例を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
int solve(int k, int l, int m, vector<int> A){
int c1 = 0, x;
int n = A.size();
c1 = 0;
for (int i = 0; i < n; i++){
x = A[i];
if (x > l && x < m)
c1++;
}
return c1;
}
int main(){
int k = 5;
int l = 3;
int m = 7;
vector<int> A = { 4, 7, 5, 5, 3, 6, 2, 8 };
cout << solve(k, l, m, A) << endl;
}
入力
5, 3, 7, { 4, 7, 5, 5, 3, 6, 2, 8 }
出力
4
-
ロボットが最終位置に到達するまでの最小ステップ数を求めるC++プログラム
2つの座標 (x1, y1) と (x2, y2) があるとします。ロボットは現在点 (x1, y1) にいて、点 (x2, y2) へ移動したいと考えています。ロボットは1ステップごとに、周囲8方向(上下左右と斜め)の隣接するマスのいずれかに移動することができます。このとき、最終位置に到達するために必要な最小ステップ数を求めます。 例えば、入力が x1 = 3; y1 = 4; x2 = 6; y2 = 1; の場合、出力は 3 になります。その様子は以下の図の通りです。 解き方 この問題を解くには、次のステップに従います。 return max(|x2 - x1|, |y2 - y1|
-
C++で平面内に形成できる平行四辺形の数を数えるアルゴリズム
本記事の課題は、平面上に与えられた点集合から形成できる平行四辺形の個数を求めることです。平行四辺形とは、四角形の対辺が互いに平行であり、それに伴って対角も等しくなる四角形のことを指します。 入力 − int a[] = {0, 2, 5, 5, 2, 5, 2, 5, 2} int b[] = {0, 0, 1, 4, 3, 8, 7, 11, 10} 出力 − 平面内の平行四辺形の数 − 3 説明 − (x, y) 座標の点が与えられており、これらの点を組み合わせると、図のように 3 つの平行四辺形を形成できます。 入力 − a[] = {0, 3, 1, 4, 1, 5} b[] =