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

C++で総売上高を計算するプログラムの書き方

問題の概要

4つの商品を販売しており、i番目の商品の価格は配列「cost[i]」で与えられているとします。商品は文字列「items」に記載された順序で販売されます。このとき、販売によって得られた総売上高を求める必要があります。文字列「items」には1から4までの整数が含まれており、重複があっても構いませんし、並び順も任意です。

たとえば、入力が cost = {10, 15, 10, 5}、items = "14214331" である場合、出力は 75 になります。

解き方の手順

この問題を解くには、以下の手順に従います。

total := 0
i := 0 で初期化し、i が items のサイズ未満の間、以下を繰り返す(i は 1 ずつ増加):
    total := total + cost[items[i] - '0' - 1]
total を返す

実装例

理解を深めるために、以下の実装例を見てみましょう。

#include <bits/stdc++.h>
using namespace std;
#define N 100
int solve(int cost[], string items) {
    int total = 0;
    for(int i = 0; i < items.size(); i++)
        total += cost[items[i] -'0' - 1];
    return total;
}
int main() {
    int cost[] = {10, 15, 10, 5};
    string items = "14214331";
    cout<< solve(cost, items);
    return 0;
}

入力

{10, 15, 10, 5}, "14214331"

出力

75

コードの解説

このプログラムでは、文字列 items の各文字を先頭から順に走査しています。各文字に対して「'0'」を引くことで文字コードから数値を取り出し、さらに1を引くことで、0始まりの配列インデックスに変換しています。こうして得られたインデックスを使って配列 cost から該当する商品の価格を取得し、変数 total に加算していきます。

たとえば、文字「'1'」の場合は '1' - '0' - 1 = 0 となるため cost[0] の値が加算されます。この処理を販売順序の文字列全体に対して繰り返すことで、総売上高を一度のループで効率よく計算できます。時間計算量は O(n)、空間計算量は O(1) であり、非常にシンプルかつ効率的な解法です。


  1. C++で最小コストの構文解析木を求める方法:区間DPとKnuthの最適化による効率解法

    ソート済みで重複のない数値リストがあり、その各要素は文字列中の「ブレークポイント(区切り位置)」を表していると仮定します。このブレークポイントをもとに、次のルールに従う木を構築することを考えます。 ノードの値:各ノードは (a, b) という値を持ちます。a と b はいずれもブレークポイントであり、そのノードが文字列のインデックス区間 [a, b] を担当することを意味します。 ルートノード:根はすべてのブレークポイントを含む、すなわち文字列全体を範囲とします。 子ノードの範囲:左の子と右の子の範囲は順序が保たれ、互いに隣接(連続)し、かつ親ノードの範囲をちょうど覆うように分割されます。

  2. C++で金額Nを支払うために必要なコインの最小枚数を求める方法

    問題の概要数値 N が与えられ、額面が 1、10、25 のコインがそれぞれ無限にあるものとします。このとき、ちょうど N を支払うために必要なコインの最小枚数を求めます。例えば、N が 14 の場合、答えは 5 枚になります。10 の硬貨 1 枚と 1 の硬貨 4 枚を組み合わせれば、合計 14 をちょうど支払えるためです。アルゴリズムの考え方(貪欲法)この問題は、価値の大きいコインから優先的に使う「貪欲法(Greedy法)」で効率的に解くことができます。手順は以下のとおりです。N < 10 の場合: 1 の硬貨を N 枚使えばよいので、答えは N 枚となります。9 < N <