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; }