C++
 Computer >> コンピューター >  >> プログラミング >> C++

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」が正しく得られます。

  1. 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 になります。初期状態では

  2. サイズ d の正十二角形を作れる組み合わせの数を求める C++ プログラム

    問題概要 整数 d が与えられたとします。ここで、一辺の長さが 1 の正方形タイルと正三角形タイルが無限枚あるものと考えます。これらのタイルを組み合わせて、一辺の長さが d の正十二角形(12 辺形)を作るとき、その作り方が何通りあるかを求めるのがこの問題です。答えが非常に大きくなる場合は、998244353 で割った余りを返します。 アプローチ この問題は、二項係数を利用することで効率的に解くことができます。結論から言うと、求めるべき答えは C(2d−1, d−1)、すなわち「2d−1 個の中から d−1 個を選ぶ組み合わせの総数」です。 階乗を直接計算すると値が急激に大きくなりオーバー