H - 気まずいチーム
問題文
$N$ 人が競技プログラミングのオンサイトコンテストに参加します。
人 $i$ の強さは $A_i$ です。
いまから $N$ 人のチーム分けをします。
どの人もちょうど一つのチームに属さなければならず、どのチームにも少なくとも $2$ 人の人が属さなければなりません。
ここで、各チームの不満度を「チームに属している人の強さの最大値と最小値の差」と定義します。
つまり、チーム $T_k$ に属する人を $i_1, \ i_2, \dots, \ i_{|T_k|}$ とすると、このチームの不満度 $D_k$ は以下のように定義されます。
- $D_k = \max ( A_{i_1}, A_{i_2}, \dots, A_{i_{|T_k|}} ) - \min (A_{i_1}, A_{i_2}, \dots, A_{i_{|T_k|}})$
各チームの不満度が $P$ 以下になるようにチーム分けをするとき、チーム数が最小になるようなチーム分けの方法を求めてください。
より厳密には、次の条件をすべて満たすチーム分けのうち、チーム数 $M$ が最小になるものを求めてください。
- どの人もちょうど 1 つのチームに属する。
- $T_1, T_2, \dots, T_M$ は $N$ 人を分割するチームであり、どのチーム $T_k$ も $|T_k| \geq 2$ を満たす。
- 各チーム $T_k$ の不満度 $D_k$ が $P$ 以下、すなわち
$D_k = \max (A_{i_1}, A_{i_2}, \dots, A_{i_{|T_k|}}) - \min (A_{i_1}, A_{i_2}, \dots, A_{i_{|T_k|}}) \leq P$
ただし、条件を満たしチーム数が最小となるチーム分けの方法が複数ある場合はそのうちの 1 つを出力してください。
出力形式は出力欄をご確認ください。
制約
- $2 ≤ N ≤ 10$
- $1 ≤ P ≤ 10^{9}$
- $1 ≤ A_i ≤ 10^{9}$
- 入力される数値は全て整数
入力
入力は以下の形式で標準入力から与えられる。
$N \ P$
$A_1 \ A_2 \ \dots \ A_N$
出力
$1$ 行目にチーム数 $M$ を出力してください。
$2$ 行目には、人 $i \ (1 \leq i \leq N)$ が所属するチームの番号を空白区切りで 1 行に出力してください。
チーム番号は、チームの不満度が小さい順に $1$ 以上 $M$ 以下の整数で表してください。
不満度が同じチームがある場合、そのチームの番号はどのように並べても構いません。
条件を満たすチーム分けの方法が存在しない場合は -1
を 1 行に出力してください。
ただし、条件を満たしチーム数が最小となるチーム分けの方法が複数ある場合はそのうちの 1 つを出力してください。
6 3
3 7 10 5 4 8
2
1 2 2 1 1 2
人 $1$, 人 $4$, 人 $5$ がチーム $1$ 、人 $2$, 人 $3$, 人 $6$ がチーム $2$ に属するとき、条件をすべて満たしておりチーム数が最小となります。
チーム番号は、チームの不満度が小さい順に整数で表すことに注意してください。
3 1
3 4 8
-1
条件を満たすチーム分けの方法は存在しません。
4 1
9 4 3 8
2
1 2 2 1
不満度が同じチームがある場合、そのチームの番号はどのように並べてもよいため、以下の出力も正解となります。
2
2 1 1 2