【スタック・キューメニュー】> STEP: 5 エスカレーター (paizaランク B 相当) [難易度: 1710 ±36]
※リンク先へ移動するためには[paiza]へのログインが必要です。
paiza ビルにあるエスカレーターは全長 K メートルあり、 1 秒で 1 メートル進みます。また paiza ビルに勤める社員が N 人おり、 i 番目の社員は時刻 A_i にエスカレーターに乗ります。各社員がエスカレーターに乗った直後に、エスカレーター上にいる人数をそれぞれ答えてください。ただしある時刻にエスカレーターに乗る社員と降りる社員がいた場合、これは同時におこなわれます。
入力値(例)
4 3
1 3 4 6
出力値(例)
1
2
2
2
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php list($n, $k) = explode(" ", trim(fgets(STDIN))); $a = explode(" ", trim(fgets(STDIN))); $next_person = 0; $person_on_escalator = 0; $que = []; for ($i = 1; $i < 50000; $i++) { if ($next_person < $n && $i == $a[$next_person]) { array_push($que, 1); $person_on_escalator++; } else { array_push($que, 0); } if (count($que) > $k) { $person_on_escalator -= $que[0]; array_shift($que); } if ($next_person < $n && $i == $a[$next_person]) { echo $person_on_escalator. "\n"; $next_person++; } } ?> |
解説
エレベーターに乗ってきた人を配列$queに入れます。
配列(リスト)の最後に要素を追加する(array_push)
1 |
array_push($que, 1); |
乗る人がいない場合は、0を追加します。
1 |
array_push($que, 0); |
//$que = [1, 0]
そして、降りる人を先頭の要素から削除します。
配列(リスト)の先頭の要素を削除する(array_shift)
1 |
array_shift($que); |
//$que = [0]
配列の右から入って左から出ていく、というイメージです。
はじめに、先頭に要素を追加するarray_unshift()を使っていたら他のケースで通過できず悩んでいました。右から入れて左から出すのイメージにしたら無事に全部通過しました。