けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 301 A - Overall Winner (7Q, 灰色, 100 点)

for 文の練習!

問題概要

高橋くんと青木くんが  N 回の試合を行った。 これらの試合の結果を表す長さ  N の文字列 [tex: S が与えられる。 i 回目の試合の勝者は、 S i 文字目が T ならば高橋くん、A ならば青木くんである。

高橋くんと青木くんのうち、勝った試合の数が多い方を総合勝者とします。 ただし、勝った試合の数が同じである場合は、先にその勝ち数に達した者を総合勝者とする。

高橋くんと青木くんのどちらが総合勝者であるか求めよ。

制約

  •  1 \le N \le 100

考えたこと

for 文を使って、文字列  S に対して次の値を求めよう!

  • num_T:文字列  S に含まれる文字 T の個数
  • num_A:文字列  S に含まれる文字 A の個数
  • last_T S_{i} が T である最大の  i
  • last_A S_{i} が A である最大の  i

これらの値が求められれば、次のように判定できる。


  • num_T > num_A のとき:"T"
  • num_T < num_A のとき:"A"
  • num_T == num_A であって
    • last_T < last_A のとき:"T"
    • last_T > last_A のとき、"A"

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    string S;
    cin >> N >> S;

    int num_T = 0, num_A = 0, last_T = -1, last_A = -1;
    for (int i = 0; i < N; i++) {
         if (S[i] == 'T') num_T++, last_T = i;
         else num_A++, last_A = i;
    }

    if (num_T > num_A) cout << "T" << endl;
    else if (num_T < num_A) cout << "A" << endl;
    else if (last_T < last_A) cout << "T" << endl;
    else cout << "A" << endl;
}