AtCoder ABC323 振り返り
連投ですが、昨日ABC323にチャレンジしたので振り返りを投稿します。
結果は相変わらずの2完でした。ただ今回はCもWCで終わってしまいました…
結果
レーティング
振り返り
A - Weak Beats
特に苦労はしなかった。Stringを出力するときはprintじゃなくてputStrLn使わないとダブルクォートも出力されてWAになることに気づいたのは学び。
B - Round-Robin Tournament
同じく特に苦労なし。降順ソートは `sortOn Down` を使うといいと知ったのは学び。
C - World Tour Finals
あ、行けるなと思ったけどWAで終わり。なんでWAになったかというと、"解いた問題をスコアのリストから除外する必要がある"ということを見落としていたからという。。終了15分前に気づいたけど、残念ながら終了時間まで気づけなかった。
より正確には、'x'が解けなかった問題になるのでこれをリスト内包表記で抽出すればいい。
[scores !! i | (i, st) <- zip [0 ..] status, st == 'x']
で、これを降順ソートして現在のスコアに足していけば問題の回答が得られる。これを書き下すとこんな感じ。
requiredProblems :: Int -> [Int] -> Int -> [Char] -> Int
requiredProblems maxScore scores currentScore status
| currentScore == maxScore = 0
| otherwise = go 0 currentScore $ sortOn Down [scores !! i | (i, st) <- zip [0 ..] status, st == 'x']
where
go cnt _ [] = cnt
go cnt currentScore (x : xs)
| currentScore + x > maxScore = succ cnt
| otherwise = go (succ cnt) (currentScore + x) xs
(ACした回答はhttps://atcoder.jp/contests/abc323/submissions/46360146 を参照。)
まとめ
WAになったときは、問題の条件を見落としてないかを見直さないといけなかったな…と反省。次こそはC解きたいな。