300.1

500にかなり手間取ったので、1000はまた今度。

250

長文読解。円卓にN人いてK番目の人から順に一番好ましい人を選び、二人を除去するという操作を行う。この操作ができなくなるまでやるとき、登場した人を順に並べて答えよという問題。すべての人はアルファベット一文字で示され、一番好ましい人は、自分とcaseが違う人のうちアルファベット順に最初の人。(つまり同じアルファベットだけになったら終了する。)


書いてある通り実装しましょう、という問題。実際に除去すると面倒なので、N人について除去済みかどうかを覚えておいて、次のK番目を選択するときにスキップすればいいだけ。

500

A以上B以下の整数のうち、すべての桁について、桁の数と隣接する桁の数の差が2以上のものはいくつあるか答えよ、という問題。


メモ付き探索するだけ。というのは一瞬で分かるが、実装にかなり手間取った。当然ながら先頭の0は無視するが、最後まで0だったらどうするか、という問題があるが、AもBも0よりは大きいので両方とも0をカウントしてしまう方が綺麗に書けるっぽい。取り敢えずA-1以下にいくつあって、B以下にいくつあるかをカウントするのが順当のはず。カウント関数は上限値を常に気にするルーチンと、上限値を気にしないで、10のべき乗個単位でメモ付き探索する部分に分かれる。上限値は文字列として持っておかないと、0がたくさん並ぶときに一気に数桁進んでしまうので注意が必要。(桁数を覚えておくのでもいいけれど、その時に必要な位置の数を取り出すのは面倒。)