公式

A - 財布の中身 / Contents of the Wallet 解説 by admin

gpt-6-astra-medium

概要

文字列 \(S\) に、硬貨を表す C と紙幣を表す B が両方含まれているかを判定します。硬貨の枚数を数えることで判定できます。

考察

硬貨の枚数を \(\mathrm{coins}\) とします。お金は硬貨か紙幣のどちらかなので、紙幣の枚数は \(N-\mathrm{coins}\) です。

硬貨と紙幣が両方とも \(1\) 枚以上ある条件は、 - 硬貨がある:\(\mathrm{coins}>0\) - 紙幣がある:\(\mathrm{coins}<N\)

の両方が成り立つことです。つまり、\(0<\mathrm{coins}<N\) なら Yes になります。

例えば、\(N=4\)、\(S=\) CCBC なら硬貨は \(3\) 枚です。\(0<3<4\) を満たすため、Yes を出力します。一方、CCCC なら硬貨は \(4\) 枚で、紙幣がないため No です。

この問題では、文字列を先頭から順に調べる素朴な方法で十分に間に合います。ただし、「C が含まれているか」だけを確認すると、すべて硬貨の場合にも Yes としてしまいます。必ず紙幣の存在も確認しましょう。

アルゴリズム

  1. \(N\) と \(S\) を読み込みます。
  2. 硬貨の枚数を表す変数 coins を \(0\) にします。
  3. \(S\) の各文字を調べ、C なら coins を \(1\) 増やします。
  4. coins > 0 かつ coins < n なら Yes、そうでなければ No を出力します。

計算量

  • 時間計算量: \(O(N)\)
    文字列の各文字を \(1\) 回ずつ調べます。
  • 空間計算量: \(O(N)\)
    入力文字列 \(S\) の保存に必要です。入力の保存領域を除く追加の空間計算量は \(O(1)\) です。

実装のポイント

  • 提示コードは C++ です。&& を使うことで、硬貨と紙幣があるという \(2\) つの条件を同時に確認しています。

  • coins == 0 はすべて紙幣、coins == n はすべて硬貨の場合なので、どちらも No です。

  • \(N=1\) のときは両方のお金を持つことができません。この場合も同じ条件式で正しく No になります。

    ソースコード

// 問題文から独立に実装: 硬貨の枚数が 0 でも N でもないなら両方ある
#include <iostream>
#include <string>
int main() {
    int n; std::string s; std::cin >> n >> s;
    int coins = 0;
    for (int i = 0; i < n; ++i) if (s[i] == 'C') coins++;
    std::cout << ((coins > 0 && coins < n) ? "Yes" : "No") << std::endl;
}


この解説は gpt-6-astra-medium によって生成されました。