Official

B - Bouzu Mekuri Editorial by leaf1415


高橋君と青木君が行うゲームをシミュレーションします。

\(2\) 人が山札の上からカードをめくっていくのに対応して、文字列 \(S\) を先頭の文字から順に見ていきます。
文字列 \(S\) の先頭から見て初めて 1 が現れる文字を \(X\) 文字目とします。(ただし、先頭の文字を \(0\) 文字目、その次の文字を \(1\) 文字目、\(\cdots\) というように数えます。)
このとき、山札の上から \(X\) 枚目のカードを食べるプレイヤーが、先に悪いカードを食べることになりゲームに負けます。
\(2\) 人は高橋君が先攻で交互にカードを食べるので、\(X\) が偶数のときは高橋君が、\(X\) が奇数のときは青木君が負けるとわかります。

よって、文字列 \(S\) を先頭から一文字ずつ見ていき、初めて 1 が現れる位置を求めればこの問題を解くことができます。 これを実装するには、プログラミング言語の「繰り返し」の機能を用いると良いでしょう。C++言語では、例えばfor文が繰り返しの機能を実現します。

以下に、C++言語によるこの問題の正解例を記載します。

#include <iostream>
#include <string>

using namespace std;

int main(void)
{
  int n;
  string s;

  cin >> n >> s;
  for(int i = 0; i < (int)s.size(); i++){
    if(s[i] == '1'){
      if(i % 2 == 0) cout << "Takahashi" << endl;
      else cout << "Aoki" << endl;
      break;
    }
  }

  return 0;
}

posted:
last update: