見出し画像

ABC210 B 解答

問題

問題文

N 枚のカードからなる山札があります。
それぞれのカードは、「良いカード」か「悪いカード」かのどちらかです。高橋君と青木君は、この山札を使って対戦ゲームをします。このゲームでは、2 人は交互に山札の一番上のカードを引いて、そのカードを食べます。
先に悪いカードを食べたプレイヤーの負けです。(ここで、山札には少なくとも 1 枚の悪いカードが含まれていることが保証されます。)
0 と 1 からなる文字列 S が与えられます。i = 1, 2, … , N について、
・S の i 文字目が 0 のとき、山札の上から i 番目のカードが良いカードであることを表します。
・S の i 文字目が 1 のとき、山札の上から i 番目のカードが悪いカードであることを表します。
高橋君が先手でゲームを始めるとき、高橋君と青木君のどちらが負けるかを答えてください。

制約

1 ≤ N ≤ 10^5
N は整数 S は 0 と 1 からなる長さ
N の文字列 S は少なくとも 1 個の 1 を含む。

考察

2人でカードを食べていきます。悪いカードを食べたら負けてしまいます。

これは上から一枚ずつ見ていけば答えが求まりそうです。

ただし、入力の数字は非常に大きいので今回は文字列で受け取ります。先頭から文字を見ていき、1が出現した時の偶数奇数で勝敗を判定してあげます。

また、もし1 が1個もなかったらどうしよう、となるかもしれませんがこれは問題文にきちんと明記されていますね。

実装

 #include <bits/stdc++.h> #define  rep(i,n) for(int i=0;i<n;++i) #define  reps(i,s,n) for(int i=s;i<n;++i)
using namespace std;
using ll = long long;
using P = pair<int, int>;
using T = tuple<int, int, int>;

int main()
{
   int n;
   string s;
   cin >> n >> s;
   rep(i, n)
   {
       if (s[i] == '1')
       {
           if (i % 2 == 0) cout << "Takahashi" << endl;
           else cout << "Aoki" << endl;
           break;
       }
   }
   return 0;
}

あとがき

余談なんですけど、なんでカードを食べるんですかね。だいぶ特殊な趣味をお持ちな方々ですね。

この記事が気に入ったらサポートをしてみませんか?