yukicoder No.268 ラッピング(Easy)の感想
問題はこちら
No.268 ラッピング(Easy) - yukicoder
この問題の肝は一周の長さの配列[2(L1+L2), 2(L2+L3), 2(L3+L1)]と何色が何周するかっていう配列[R, B, Y]をどういう組合せで掛け算して足し合わせると一番小さくなるかってとこですね。
この問題は高々3 * 2 * 1 = 6通りしかないので私はとりあえず総当たりで解いちゃいましたがもっと大きくなると総当たりは計算量的にきついです。
それで、まあ何となく「大きい順にソートしたのと小さい順にソートしたのを掛け合わせて足すのが一番小さくなりそうだなー」って直感的に思いますよね。
もうちょっと一般化すると
に対して、以下のようなことが成り立ちそうだなって思います。
任意の置換に対して
のときなら話は簡単で組合せとしてはとしかないので
であることだけ示せばよいです。これは右辺を移項して
を示すとよいです。これは左辺を変形してやると
であるので確かにこの不等式が成り立っていることが分かります。
それで一般の場合に戻ると、任意の置換pをバブルソートで降順にソートすることを考えてみます。
するとバブルソートの一回の入れ替えで起きるのは2つの要素の入れ替えだけなのでこれはn = 2の場合に帰着できます。
バブルソートしていく過程で元の内積より等しいか、小さくなるかなので降順のバブルソートが終わったときも一般の不等式が成り立っていることが分かります。
……っていうことがGoogle Code Jamの過去問で出てたらしく「なるほどなぁ」って思いました。面白かったです。
Dashboard - Round 1A 2008 - Google Code Jam
解説
Dashboard - Round 1A 2008 - Google Code Jam