AtCoder: diverta 2019 Programming Contest
A. Consecutive Integers
区間を覆う問題は何度か解いたので記憶していた.図を描けばわかりやすい. 解答例
選ぶ連続した整数を区間と見る.例えばのとき,
ooo.....
のようになり,'.'
の数だけ区間を右にずらせる.'.'
の数はであるから,答えは初期位置も含めて.
B. RGB Boxes
各色について買う箱の個数を決め打ちすることを考える:例えば赤ならそれぞれ個以上個以下[1](も同様).これだとであり間に合わないが,2種類だけ決めれば残りに必要な箱の個数は求まる:箱の個数をそれぞれとおくと.これが割り切れかつ先の範囲内でなければならない.この方針ならであるから間に合う.
ところでeditorialがそうしているようにの上限はでも,の上限のでもよい(どうせが負になるため).
C. AB Substrings
コーナーケースに引っ掛かっていると思って色々試行錯誤した挙句元々の解法が間違っていた. 解答例
まず各文字列の中のAB
の個数を数える.次に末尾にA
や,先頭にB
があるものを組み合わせてAB
が作れることに注意する(文字列の中のAB
とは重ならないので安心).両方を兼ね備える文字列に注意:パターンBA
とおく.そうでなく末尾にA
,先頭にB
があるものをそれぞれパターンXA
, BX
とおく.これらの組み合わせ方を考えたい(どちらでもないパターンはどう組み合わせても意味が無いので以下無視する).
はじめばXA
とBX
,およびBA
をそれぞれ独立に組み合わせた後で合体させればよいと考えていたが,誤りである:例えばBA=3
,XA=2
,BX=2
のとき,XABX+XABX+BABABA
となって5個であるが,最適なのはXABX+XA+BABABA+BX
の6個である.このようにBA...BA
の先頭および末尾にあるB,A
を活用してそこにXA
, BX
を組み合わせたほうが得をする.
以上より:
BA
があるとき:BA...BA
の中にAB
は個- さらに両側にそれぞれ
XA
,BX
を追加できるXA
,BX
のそれぞれについて,それが1個以上あればAB
が1個増える(XA
,BX
も1個減る).これらは破壊的に更新されたとする.
- 余った
XA
,BX
同士を組み合わせてXABX...XABX
を作る:AB
は個 - 従って
BA
がないとき:XA
,BX
の組み合わせのみ.従って
文字列の中の特定文字列の個数を数える関数が見当たらなかったので適当な実装をした.最初はStr.split
結果のlength
から1引いたものとしていたが,JavaScriptなどと異なりこれは特定文字列が先頭や末尾にある場合に空文字列が入らないためズレてしまう[2].そこで単純にループによる数え上げで実装した.あるいは検索対象の先頭に適当な文字(例えば本問では小文字は出ない)を入れたり,JavaScript版を再現したりすれば大丈夫.
D. DivRem Number
感触は300点,数学要素も考慮すると簡単目な400点問題な気がする. 解答例
500点問題ということで最初数分は難しく考えすぎてしまったが,素直にと表示すればよい:,.これらが等しくなるようなを求めたい:.よっての約数が分かればの候補が得られる.あとは元々の条件を確かめればよい(除算にならないように注意).