167.1

250

線分上における、複数の物体の移動速度と移動方向が与えられる。すべての物体が線分から外に出るまでの間、線分上のどの地点に物体があるかを文字列にして順次列挙せよ、という問題。


単純にシミュレーションして、サンプルが通ればおしまい。

750

コーチとアシスタントコーチとチームメンバーの身長が配列で与えられる。コーチが中央で、アシスタントコーチが両端になるように並ぶ時に、隣合う二人の身長差の合計の最小値を答えよ、という問題。


取り敢えずアシスタントコーチを固定して考える。人数が偶数の場合、コーチの位置は二通りあるので、その場合だけ例外処理をする必要がある。コーチとアシスタントコーチの間に入る人達はソートしておけば身長差が最小になる。で、高い順か低い順の両方を試してみればいい。コーチとアシスタントコーチの間に入る人達は、残り全員をソートした上で、それを半分に分ければ、これまた身長差は最小になる。ということで、高々8通り試してみて、一番良いものを返せばおしまい。


通常500点の問題をわざわざ750点にしているのはなんでだろう、というくらいには難度が低め。次が900点だからなのかも知れないけれども...。

900

異なる6文字のアルファベットが書かれたサイコロを振る。見える面が3面のみで、上面、前面、右面となる。この状況で、複数回サイコロを振った結果が与えられるので、最初に出現する間違った結果を検出せよという問題。なければ-1を返す。


色々フィルタをかければ終わりそうな問題ではあるけれど、忠実に面を埋めていくアプローチが正解のようで...。取り敢えず最初の試行で3面埋まり、次の試行で同じ文字があれば適宜埋めていく。全部違えば逆の3面(順番のみ)が分かる。これで最初に矛盾したらおしまい。


この問題は忠実にエミュレートしようと思い立つことが重要な問題。その後はやる気さえあれば解けるんじゃないかなぁ。手抜きフィルターだとあんまり通らない。


長さ4の文字列を6つ格納する配列を用意して、最初は????か何かで初期化しておく。最初の試行で出てきた三面について、同じ文字があったら矛盾。なければ、該当する配列3つを引っ張ってきて、自分の隣接面を格納していく。該当する配列が取得できない(7文字目)場合は矛盾。隣接面情報は2面ずつ増えていくので、今までにでてきた面があるのなら、それに沿うように入れ、そうでなければ最初の?を置換していく。このとき?がないのに新しいのを入れたり、既に入っている箇所に別の文字を入れたくなったりしたら矛盾。


という感じのソースになるんじゃないでしょうか。