005 - ホテル探し
時間制限 1 秒 / メモリ制限 64 MB / 得点 11 / x 1 /
Problem
会津合宿に参加予定の高槻さんは、家が貧乏であまりお金を持っていない。彼女は、合宿のためにホテルを探しているが、なるべくお金を節約できるプランにするために、悩み中である。宿泊の合計金額が安くなるホテルの泊まり方を求めて、彼女に教えてあげよう。
宿泊するホテルの候補数は、N個であり、各ホテルをホテル1、ホテル2、...、ホテルNと呼ぶこととする。彼女は、これからD泊分の予約をこれらのホテルから選ぶことにしている。候補のホテルは全て、1泊ごとに宿泊料金が変動することがあるため、入力では各ホテルごとにD泊分の宿泊費が与えられる。
D泊分の宿泊費の合計が最小になるような、ホテルの泊まり方を出力せよ。ただし、D泊全て同じホテルに泊まる必要はないことに注意してほしい。安さのためであれば、彼女は1泊ごとにホテルの移動をすることも考えている。
もし、そのような宿泊方法が複数あるならば、ホテルの移動回数が最小になるような宿泊方法を出力せよ。ホテルの移動回数とは、x泊目(1 <= x < D)の宿泊ホテルとx+1泊目の宿泊ホテルが異なる場合にこれを1回の移動と考え、D泊分足し合わせた値である。
それでも1通りに定まらない場合は、辞書順で最も小さくなるような宿泊方法を出力すること。2つの宿泊ホテル番号の数列 A = {a1, a2, ..., aD} と B = {b1, b2, ..., bD} があったとき、AがBより辞書順で小さいとは、aiがbiと異なるような最初のiについて、aiがbiより小さいときのことを言う。
Input
N D p1,1 p1,2 ... p1,D p2,1 p2,2 ... p2,D … pN,1 pN,2 ... pN,D
入力は、全て整数である。Nは宿泊候補のホテルの数、Dは宿泊日数である。pi,jは、ホテルiにおける、j泊目の宿泊費である。
Constraints
・1 <= N <= 50
・1 <= D <= 50
・1 <= pij <= 10000
output
各データセットに対して、以下の形式で出力せよ。
P M stay1 stay2 … stayD
PはD泊分の最小の宿泊費合計、Mは最小のホテル移動回数である。続いて、問題文に指定された条件で宿泊するホテルを決定し、D泊分のホテルの番号を出力せよ。stayi (1 <= stayi <= N)は、i泊目に宿泊するホテルが、ホテルstayiであることを意味する。
入出力例
入力例1
2 3 3000 6000 3000 4000 5500 4500
出力例1
11500 2 1 2 1
解説
最小の宿泊費合計は、11500円であり、この合計値を満たせるのは、 1泊目にホテル1に泊まり3000円、2泊目にホテル2に泊まり5500円、3泊目にホテル1に泊まり3000円の方法だけである。ここでは、1泊目と2泊目の間、2泊目と3泊目の間、の合計2回ホテルの移動を行っている。
入力例2
3 4 5500 5500 5500 5500 5480 5780 5980 5980 5500 5500 5500 5500
出力例2
21980 1 2 1 1 1
解説
このサンプルの宿泊費合計の最小は21980円である。合計をこの価格にするための方法は何通りか存在するが、移動回数を最小にするならば、A = {2, 1, 1, 1}、B = {2, 3, 3, 3}の2通りにしぼられる。この2通りの内、辞書順で最小なものはAであるため、これを出力する。