競技プログラミング用 知識集積所
ABC453C - Sneaking Glances
最終更新:
sport_programming
-
view
問題
必要知識
B以下レベルの内容は省略
別解の場合
考え方
C問題は「愚直にやるとTLE」という問題が多い。
しかし今回はNが最大でも20であり、愚直にやっても2^20通りそれぞれ20ステップのシミュレーションで、約2100万回の計算で終わる。
むしろ、変に貪欲法※などを使うとWAになる。
しかし今回はNが最大でも20であり、愚直にやっても2^20通りそれぞれ20ステップのシミュレーションで、約2100万回の計算で終わる。
むしろ、変に貪欲法※などを使うとWAになる。
問題は、愚直にやるコード自体が少し難しい点。
2択がたくさんあることから、通常はbit全探索※を用いることになる。
2択がたくさんあることから、通常はbit全探索※を用いることになる。
あとは通常通りのbit全探索※。
0を左へのジャンプ、1を右へのジャンプとして、N回のジャンプ2^N通りを全部シミュレーションして、通り過ぎ回数最大のものを探せばよい。
0を左へのジャンプ、1を右へのジャンプとして、N回のジャンプ2^N通りを全部シミュレーションして、通り過ぎ回数最大のものを探せばよい。
小数を扱うのはいろいろ発生するリスクがあるため、座標全部から0.5を引き、「0と-1の間を通った回数は?」という問題にすると実装しやすい。
解答例
注意点
long long型を用いる
別解
動的計画法っぽく解く
bit全探索※部分を、代わりに動的計画法っぽくすることもできる。
i回目のジャンプの後、「どこにいて、通り過ぎ何回」のありえる可能性を全てDPの継承情報として保管する。
これをジャンプの回数だけ更新処理していけば、全ジャンプパターンの行先と回数を求められる。
その中から回数の最大値を探せばよい。
解答例
i回目のジャンプの後、「どこにいて、通り過ぎ何回」のありえる可能性を全てDPの継承情報として保管する。
これをジャンプの回数だけ更新処理していけば、全ジャンプパターンの行先と回数を求められる。
その中から回数の最大値を探せばよい。
解答例