notes

競技プログラミングで解いた問題を記録しています。

第四回 アルゴリズム実技検定(A~L)

A - 中央値

解答:Submission #17975213 - 第四回 アルゴリズム実技検定

解法:ソートして2番目のものを答える。解答はA, B, Cで出力する必要があるため、元の添え字を覚えておき、charとして出力する。


B - 電卓

解答:Submission #17976377 - 第四回 アルゴリズム実技検定

解法:y = 0 ならERRORを先に出力してしまう。そうでない場合、100倍してintの切捨除算を行った後、double型で小数表示すればよい。計算誤差も大丈夫そう。


C - 隣接カウント

解答:Submission #17978357 - 第四回 アルゴリズム実技検定

解法:#の数を愚直に数える。外側に1マスずつ.のマスを追加しておくと境界条件を減らすことができる。


D - 分身

解答:Submission #19195860 - 第四回 アルゴリズム実技検定

解法:タイプAとタイプBの操作はそれぞれ結果が順番によらず回数のみによる。そのため(タイプAの操作回数, タイプBの操作回数)の操作回数の和の小さい順にBFSで実際に操作をシミュレーションすればよい。


E - アナグラム

解答:Submission #18024607 - 第四回 アルゴリズム実技検定

解法:next_permutationを使い、文字列の並べ替え全てで条件に合致するかを確認する。


F - 構文解析

解答:Submission #18024607 - 第四回 アルゴリズム実技検定

解法:mapを使って文字列ごとの出現回数を調査し、K番目に大きいものを解答すればよい。ただし、タイがある場合にはAMBIGUOUSを出力する。タイの判定方法は、K-1番目とK番目の文字列の出現回数が同じ、もしくはK番目とK+1番目の文字列の出現回数が同じ場合、かつその時に限りタイになるとすればよい。


G - 村整備

解答:Submission #18041579 - 第四回 アルゴリズム実技検定

解法:#のマスごとに、そのマスを.に変えた場合に「全てのマスから全てのマスに行き来できるか」を確認し、行き来できたマスの数をカウントする。「」部分の確認は、.であるマスからDFSを開始し、1回の探索で全てのマスに行けることを確認すればよい。


H - マス目のカット

解答:Submission #18163458 - 第四回 アルゴリズム実技検定

解法:先に正方形として抽出する範囲を決め、「その正方形の数字を同じ数字にするために変えるべき数字の最小値」がK以下である場合に、そのときの正方形の1辺の長さを出力すればよい。


I - ピザ

解答:Submission #19907062 - 第四回 アルゴリズム実技検定

解法:取りうる(連続した)添字集合をS、a[i]の合計をSumとすると、 |2 \sum_{i \in S} ai - Sum |を最小化すればよい。これは連続した添え字のうち左端を固定すると右端はざっくり\sum aiSum/2以下となるもの、または\sum aiSum/2より大きくなるものの2種類を調べればよく、これはしゃくとり法で実装できる。


J - ワープ

解答:Submission #18635507 - 第四回 アルゴリズム実技検定

解法:ワープも考慮してダイクストラ法を使いたいが、ワープの各頂点を愚直に結ぶと辺の数がN2のオーダーになってしまう。ain, bin, cin, aout, bout, coutの6つの頂点を別に用意し、以下の辺を追加してダイクストラ法を行えばよい。

  • タイプAの頂点とainをコスト0で結ぶ(B, Cも同様)
  • ainとboutをコストXABで結ぶ(他のin, out頂点も同様)
  • aoutとタイプAの頂点をコスト0で結ぶ(B, Cも同様)


K - 転倒数

解答:Submission #18649815 - 第四回 アルゴリズム実技検定

解法:作成中です。公式解説はコチラ


L - マンションの改築

解答:Submission #18663672 - 第四回 アルゴリズム実技検定

解法:mapに(隣接項の差, 偶奇)ごとの個数を記憶しておく。また、t=1による増減分をev, t=2による増減分をodという変数に持たせることとする。

t=1, 2の時ev, odをそれぞれ更新する。mapで取得すべき項目は変化するが、map自体は変化しない。t=3の時はmapを更新する。