競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 286 参加

 

ABC286

ABC286受験結果
A~E の1500点
STLを使えば実装はもう少し早かった.

C問題
操作が複数与えられた場合は,順序を変えるとどうなるかを考えると役立つケースが多い.
今回は最適解として, Rotateを何回か \(\rightarrow\) 置き換えを何回か の形のものが存在する. よって, 最初に何回rotateするかを全探索. あとは,置き換えの必要回数は,両端から文字列の一致を調べればよい. 一応,文字列の長さの偶奇に注意.

D問題
これもTLEとWAを出してしまった. WAはテストケースを実行してれば防げたのに,急いで提出したせい.

  • 問題文をきちんと読むこと,
  • 計算量を見積もること.

それらを守れば防げた.
DFSで全探索したがTLEした.これは計算量を見積もればすぐに分かることだった. 実装にかけた時間を無駄にしてしまった. AC解法は,ループを使ったDP.
\(i \in N \)とする. \(y\) 円作るために, \(j \in [0,i)\) に対して, 硬貨 \(j\) を何枚使うか決めたとする. 残りの硬貨 \([i,N)\) を何枚ずつ使うかどうかを決めるときは, 今 \(y\) 円ということだけが重要で, 何枚ずつ使ったかは関係ない.

E問題
BFSでOK. (移動コスト, お土産の値段) のペアをもってBFS. ただし,移動コストは昇順,お土産は降順としたいので, お土産の値段に-1を掛けておいて, ペアの min をとりながら遷移.
TLE を出してしまったが,改良してAC. 直した部分は以下の通り.

  • クエリ毎のBFSをしないで,前計算した
  • 前計算も,source だけ全探索で十分
  • map を使わずにvector にした
Warshall-Floyd を用いる場合は, スタート地点またはゴール地点のお土産を買うタイミングに注意.

実装は,Wa-shall-Floyd の方が楽だし,負コストの辺があっても正しく動く.

もし試験で沼った場合は,複数の解法を持っていれば,別の方法で書き直す手段も取れる.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"