KEYENCE Programming Contest 2019

A - Beginning

ソートして1479になるか。簡単でも複雑だと時間かかるね。

B - KEYENCE String

これ実装が難しい。

C - Exam and Wizard

状況は単純。大きいのから小さいのに移すだけ。何かを経由して移す意味はないので、ピッタリのやつはそのまま、小さいやつは必ず変更される、問題は大きいやつだ。AとBはその差だけが重要なので、A-=Bとしておく。変更する個数を最小化したいので大きい順に取っていく。

ここまで順調に解けている。昨日と同じだなと思う。現状の順位は昨日より低いだろうけど。

D - Double Landscape

A,Bはソートしていい。つまり、大きい順に並んでるケースだとしても答えは同じ。Aを順に見ていく。K=N*Mとして、A[0]はKでなければならない。A[1]がK-1なら、K-1はその行のどこかにある。B[1]がK-1ならそこで確定。そうでないなら、その列より左にある。A[1]がK-3なら、K-3はその行だが、K-1とK-2はより上の行。A[1]がK-1なら確定だし、K-4とかだったらより左の列とわかる。こんな感じで、各数毎にありえる範囲が決まり、範囲の小さい順に見ていくことができれば、単に掛け算していくだけで解ける。ただ、1次元の場合はそれでいいとして、条件がA,Bの2つあるのでつらい。そもそも状況が複雑すぎて、昨日と同じで書き切れる気がしない。何か上手いまとめ方があるのかもしれないが。

ちょっと視点を変える。必要条件をたくさん集めればいつの間にか必要十分条件になっていたりしないだろうか。各数について範囲を考えると、大きい数から順に見ていけば関係するA,Bの位置は(広義)単調増加だ!まあ、確定しちゃうこともあるので、それでいいかは別だが、必要条件的ではある(あとで気づいたが、答えはそれ以下だとわかる)。隣の行との差も1以上M以下でないといけない。と思ったらサンプルがおかしいのでよく見ると、べつにM以下でなくてもいい(端っこだけ小さい数だけになってるとか普通にある)。その条件を外すとサンプルが通った。残り時間もないし提出してみる。WA。しかし、その結果を受けてコードを見直すと、どうも正しいコードであるように思えてくる。WAという結果を見たあとなのに、WAじゃないという空気が漂っている。そう思って見ると、変数名を直し忘れているのが2か所も。直して提出するとACだった。これは解けたと言えるのか(言えなさそう)。

E - Connecting Cities

要するに木を構築すればいい。順に最小値を更新していけば全てのノードについて最小コストの相手がO(N)で求まるし、自分より番号が若いノードを親として貪欲に張ればいいだけでは?実装して気づいたが、0番がルートと決まってるわけじゃなかった。酷い。酷いけど、この短時間で考えるなら普通にあることだ。コンテスト中に30分くらいで解くには、そういう勘違いをしないくらいの圧倒的な実力が必要なのだ。さて、最小全域木じゃんと今ごろ気づく。なんかコストの低い順に貪欲でよかったりしないかなと少し考えていたが、それってまさにクラスカル法じゃん。ただ、その方針で考えても、どうにも解けない。