311.1

昔のセットを解く作業...。点数とクオリティが今とはマッチしていない感じ。

300

同じ大きさのバイナリ行列が二つ与えられる。3x3の領域について値を反転させる作業を行って、二つの行列を一致させるとき、必要な最小反転数を答えよ、という問題。


要は左上から順番に必要に応じて反転いけばいいだけ。実装を楽にするために例外を使うといいかも?(3x3行列の左上じゃないと反転できないので、3x3だけ反転しようとすると元の行列からはみ出す。)

600

A以上B以下の整数の各桁に登場する整数の和を答えよ、という問題。


取り敢えず0からAまでの整数の各桁に登場する整数の和が計算できれば、後は引き算するだけ。Aはかなり大きいので多少高速化する必要がある。Aの先頭の数字がSだったとすると、0からS-1までの整数については、それ以降の桁が0から9まで均等に登場する、ということをうまく使ってやればいい。先頭がSのものは、次の桁を同様に調べていって...、という感じ。

1000

それぞれの数字について、表現するのにかかるコストが与えられる。全部で利用できるコストの量が与えらえれるので、表現できる最大の数を答えよ、という問題。値がかなり大きいので、頭と尻尾の50桁ずつ答える。


どの数字も表現できない場合は空文字列を返す。0がたくさん使える場合は0を返す。後は、一番小さいコストで表現できる数字のコストと、自分のコストから、自分を使ったときの最長の長さを0以外の数字について調べる。このときの最大値が実現できる最長の長さ。


後は大きい方の数字から、この最大長を維持しながら自分が何回使えるか(バイナリサーチで)求めていけば、すべての数字が何回ずつ使えるか分かる。頭と尻尾の50桁を求めればおしまい。