3匹の猫

みみねこの競プロ精進メモ

パナソニックプログラミングコンテスト(AtCoder Beginner Contest 186)参加記(~E問題)

100-200-300(1)-400-500-0で1ペナ5完1500点。

A - Brick

割り算の問題で、\dfrac{N}{W}の商が答えとなる。余りは切り捨ててよい。

計算量は、O(1)

B - Blocks on Grid

ブロックに対してできる操作は、「ブロックを取り除く」のみである。この操作でブロックの個数が増えることはないので、操作後のブロックの個数はすべてのマスの中で一番少ないものに合わせる必要がある。
よって、マス目を全探索してブロックの個数の最小値A_{min}を保持し、各マスにあるブロックの個数A_{i, j}A_{min}の差の総和を求めればよい。

計算量は、O(HW)

C - Unlucky 7

公式解説とは違うオーバーキル気味な方法で通した。

前計算として、「10進数で表すと7を含む」「8進数で表すと7を含む」数を列挙する。再帰関数で幅優先探索を実装し、7が含まれる数のみを配列に放り込んでsort->unique->eraseすると、7を含む数が昇順で並ぶ。あとは与えられたN以下の数の個数を、配列の二分探索を用いて求めればよい。

計算量ってどれくらいなんだろう?幅優先探索で生成されるノードの数は10進数の場合111111個なんだけど、これを数式でNを使ってきれいに書けないな…。O(N)くらいということにしておく。
[追記]ソートしているので計算量はO(N\log N)でした。ソートの存在忘れがち

A進数をB進数に変換する関数を暇なときに組もうと思った(暇なときにやる気が起きるはずがないので永遠に実装されない)。

D - Sum of difference

絶対値記号が邪魔なので配列をソートして考える。さらに引かれる数と引く数ごとにわけて考えると、それぞれの整数が足される回数は配列の添え字番号に依存していることがわかる。
具体的には、
\displaystyle \sum_{i=1}^n \{A_i\times i\} - \displaystyle \sum_{i=1}^n \{A_i\times (N-i)\}
が答え。

計算量は、O(N)

E - Throne

拡張ユークリッドの互除法で解いた。

玉座0番目の椅子と考えると、
S+Ki \equiv 0 \pmod N
を満たす最小のiが解となる。少し変形すると
Ki \equiv N-S \pmod N
となる。これは、拡張ユークリッドの互除法を用いて
Kx+Ny=N-S
を満たすxを求める問題に落とせる。

計算量は、O(T\log N)

F - Rook on Grid

解けなかった。縦→横と動くパターンと、横→縦と動くパターンで分けて考えた後重複するマスを引く方針で考えたが、上手くいかずタイムアップ。もっと形式的にできるっぽい。

感想

C問題とE問題を解くのが遅かった。特にC問題は単純実装でも通る問題だったので、オーバーキル解法をゴリゴリ実装する前にもっと簡単に記述できる解法はないか考えるべきだった。