Codeforces Round #556 (Div. 2)
バチャした。紫なんですけど、Div2でしました。
A. Stock Arbitraging
問題:株を買ってから売って現金を最大化せよ
考察:
もっとも安いときに買って、高いときに売ればよいです。
なぜか最適かわからんくなって5分
B. Tiling Challenge
問題:十字のブロックを使って敷き詰めろ
考察:
上のブロックを基準に貪欲する。
結構実装が典型っぽくて5分でかけた、自己評価〇
C. Prefix Sum Primes
問題:1と2が与えられる。好きなように並べて、接頭辞の合計を並べる。素数の数を最大化せよ
考察:
素数は2以外奇数である。
なので、2を出した後3にして、そこから2ずつ増やすようにすればよい。
2の数と1の数が0のときは別で考えると、2,1,2222,1111とすればよい
D. Three Religions
問題:文字列sが与えられる。文字列1~3をクエリで更新する。この1~3がそれぞれ重複しないように文字列sの部分文字列にすることができるか判定せよ
考察:
DPをする。
dp[i][j][k]:1のi文字目、2のj文字目、3のk文字目が出るような、sの最前index
もし1にi文字目を追加するときは、i-1=>iの更新と、j、kについてすべて探索する。
したがってO(QM^2)である。
ここであるindex以降の最前のアルファベットが知りたい。
二分探索でもよいが、26*nの配列すべてで前計算したほうがはやい。
二分探索は意外と効く