C++で階段の数と各階段の段数をカウントするプログラム
本記事では、配列Aに含まれる情報から、登った階段の数と、それぞれの階段の段数を求めるC++プログラムを紹介します。
問題の概要
n個の要素を持つ配列Aがあるとします。Amalは多層ビルの中で階段を上っており、階段を上るたびに1から数え始めます。例えば、3段と4段の2つの階段を上った場合、「1, 2, 3, 1, 2, 3, 4」のように数字を発します。
配列Aには、Amalが発した階段番号が記録されています。この配列をもとに、彼が何回階段を上ったかをカウントし、さらに各階段の段数を出力する必要があります。
例えば、入力が A = [1, 2, 3, 1, 2, 3, 4, 5] の場合、出力は「2」と「[3, 5]」となります。これは、2つの階段を上り、それぞれが3段と5段であることを意味します。
解法のアプローチ
この問題は以下の手順で解くことができます。
- 配列Aの要素を先頭から順に走査し、値が1になっている箇所をカウントします。これは新しい階段を上り始めたタイミングを示すためです。
- カウントした数が、登った階段の総数になります。
- 次に、値が1である要素の直前の要素を出力します。これは直前の階段の最後の段数(=その階段の総段数)に相当します。
- 最後に、配列の末尾の要素を出力します。これは最後の階段の段数です。
p = 0
n := size of A
for initialize i := 0, when i < n, update (increase i by 1), do:
if A[i] is same as 1, then:
(increase p by 1)
print p
for initialize i := 1, when i < n, update (increase i by 1), do:
if A[i] is same as 1, then:
print A[i - 1]
print A[n - 1]
C++による実装例
理解を深めるために、実際の実装を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
void solve(vector<int> A) {
int i, p = 0;
int n = A.size();
for (i = 0; i < n; i++) {
if (A[i] == 1)
p++;
}
cout << p << endl;
for (i = 1; i < n; i++) {
if (A[i] == 1)
cout << A[i - 1] << ", ";
}
cout << A[n - 1];
}
int main() {
vector<int> A = { 1, 2, 3, 1, 2, 3, 4, 5 };
solve(A);
}
入力
{ 1, 2, 3, 1, 2, 3, 4, 5 }
出力
2 3, 5
コードの解説
このプログラムでは、まず最初のループで配列内の「1」の出現回数を数えています。「1」は階段を上り始める合図なので、その回数が階段の総数pになります。
次のループでは、「1」が出現した位置の一つ前の要素を出力しています。例えば、インデックス3の値が1の場合、インデックス2の値「3」は最初の階段の段数を表します。
最後に配列の末尾の要素「5」を出力することで、最後の階段の段数も表示されます。これにより、階段の数「2」と各階段の段数「3, 5」が正しく得られます。
-
C++で解く!コインを払ってNに到達するための最小操作回数を求める方法
問題の概要5つの整数 N, A, B, C, D が与えられます。数値を0から開始し、目標値Nまで到達させることがゴールです。数値は以下の操作を、それぞれ決められた枚数のコインを支払うことで変更できます。数値を2倍する:A枚のコインが必要数値を3倍する:B枚のコインが必要数値を5倍する:C枚のコインが必要数値を1増やす、または1減らす:D枚のコインが必要これらの操作は何回でも、好きな順序で実行できます。Nに到達するために必要な最小のコイン枚数を求めましょう。入力例と出力例例えば、入力が N = 11、A = 1、B = 2、C = 2、D = 8 の場合、出力は 19 になります。初期状態では
-
サイズ d の正十二角形を作れる組み合わせの数を求める C++ プログラム
問題概要 整数 d が与えられたとします。ここで、一辺の長さが 1 の正方形タイルと正三角形タイルが無限枚あるものと考えます。これらのタイルを組み合わせて、一辺の長さが d の正十二角形(12 辺形)を作るとき、その作り方が何通りあるかを求めるのがこの問題です。答えが非常に大きくなる場合は、998244353 で割った余りを返します。 アプローチ この問題は、二項係数を利用することで効率的に解くことができます。結論から言うと、求めるべき答えは C(2d−1, d−1)、すなわち「2d−1 個の中から d−1 個を選ぶ組み合わせの総数」です。 階乗を直接計算すると値が急激に大きくなりオーバー