ABC 046 - D: AtCoDeerくんと変なじゃんけん

問題

D - AtCoDeerくんと変なじゃんけん / AtCoDeer and Rock-Paper

解説

(※) 各ターンの後で、(今までにパーを出した回数)≦(今までにグーを出した回数) を満たす

この制約を満たすために、先ずは全てグーで出してみる。相手がパーを出したときに得点が減少する。 その後、

  • 相手がグーのとき自分をパーに変えたら、「引き分け」が「勝ち」になり+1
  • 相手がパーのとき自分をパーに変えたら、「負け」が「引き分け」になり+1

つまり、相手がいつ何を出すかに関わらず、パーを出しただけ +1 得点を獲得できる。

このように、先に失点計算をすると、得点計算の方法を出す手に関わらず同一化することができる。

コード

int main() {
  string s; cin >> s;
  // 最初、すべてグーを出したものとする
  int ans = 0;
  rep(i, s.size()) {
    if (s[i] == 'p') {
      ans--;
    }
  }
  // パーを貪欲選ぶ
  int max_p = s.size() / 2;
  cout << (ans + max_p) << endl;
}