【配列活用メニュー】> 【配列に対しての複雑な処理】STEP: 5 場所取り (paizaランク C 相当) [難易度: 1418 ±18]
※リンク先へ移動するためには[paiza]へのログインが必要です。
開店直後に店に入るために、番号 1 〜 N の N 人が開店前に店の前にブルーシートを合計 K 枚置きました。ブルーシートの先頭は A_1 , 最後尾は A_K です。しかし、店側は先頭から F 枚のブルーシートを撤去しました。
1 〜 N 番の人々は次のルールに従って店に並びます。
・自分のブルーシートが 1 枚以上残っているとき、自分のブルーシートのうち、最も先頭に近いブルーシートの位置に並ぶ。
・自分のブルーシートが 1 枚も残っていないとき、並ぶことなく帰宅する。
全員が並び終わった後に待機列にいる人の番号を先頭から順に答えてください。
例
・N = 3, K = 6, F = 3, A = [3, 2, 1, 2, 3, 2] のとき
撤去が行われる前と行われた後のブルーシートの様子は次の通りになります。
店側 | 3 | 2 | 1 | 2 | 3 | 2 |
店側 | 2 | 3 | 2 |
番号 1 の人のブルーシートは 1 枚も残っていないので並ぶことなく帰宅します。
番号 2 の人のブルーシートは 2 枚残っているので、最も先頭に近いブルーシートの位置に並びます。
番号 3 の人のブルーシートは 1 枚残っているので、そのブルーシートの位置に並びます。
最終的な待機列は次の通りになるので、期待する出力は
2
3
となります。
入力値(例)
5 10 1
1
4
4
3
5
4
2
4
1
1
出力値(例)
4
3
5
2
1
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php list($n, $k, $f) = explode(" ", trim(fgets(STDIN))); for($i = 0; $i < $k; $i++) { $array[] = trim(fgets(STDIN)); } $arr_f = array_slice($array, $f); //print_r($arr_f); $arr_unique = array_unique($arr_f); //print_r($arr_unique); foreach($arr_unique as $value) { echo $value. "\n"; } ?> |
解説
ブルーシートの番号を配列で受け取ります。
配列から先頭のn個を取り除く残りを配列で取得するarray_slice()を使って、$f個を取り除きます。
配列の重複を取り除くarray_unique()で重複を取り除きます。
foreach()で値を一つずつ取り出して出力します。