演習課題「円卓処理」
末端から始点にもどる、円卓処理の練習問題です。
入力値の形式は長テーブルのうなぎ屋と同じとします。
座席番号を座席数分出力するループを、
時計回りで、3から座席数分の席番号を出力するように書いてみましょう。
■出力例
345612
■入力例
6 3 …6席のテーブル(座席数)、店に3グループがやってくる
3 2 …第1グループ:3名のグループで、2番目の席から座り始める
1 6 …第2グループ:1名のグループで、6番目の席から座り始める
2 5 …第3グループ:2名のグループで、5番目の席から座り始める
座席数として、入力される値の1行目、最初の値(下記の例では 6 )を取得後、
for文で席数分のループを作成します。
ループは3席目($i=2)からスタートし、2+座席数分のループをまわします。
$i が座席数を超えた場合、座席数分引いてやる事で始点に戻します。
この場合 $i を直接いじると無限ループに陥るので、別の変数を使って処理をしましょう。
ループ時は、6席の場合、$i は 0〜5 で処理をするので、出力処理は +1 して出力します。
これは席番号が 1~6 になる為です。
期待する出力値
345612
#09:実装:円卓処理
このチャプターでは、丸テーブルのうなぎ屋問題の肝である、円卓処理を実装します。
各グループ毎の空席確認のループで $j が座席数を超えてしまったら、
最初の席から空席確認をするように円卓処理をしてみよう。
入力値を変更して、座席の一番最後と最初をまたがって座るグループを作ってデバッグしてみよう。
円卓処理は空席確認の前で行いましょう。
$j の値で円卓を表現しようとすると無限ループになるので、 $search_point という別の変数に
円卓処理後の空席確認をする席番号を入れましょう。
円卓処理の確認のためには、6番目の席から複数人座るグループをテストデータとして作ってみると良いでしょう。
$seat_num …テーブルの座席数
$group_num …店にやってくるグループ数
$i …グループ分のループをまわすfor文のイテレータ
$group_array …標準入力2行目以降のグループ人数と着席開始位置の入った配列
$group_person_num …各グループの人数
$sit_point …着席開始位置
$seat …空席確認用の座席配列
$j …各グループの人数ループをまわすfor文のイテレータ
$search_point …空席確認をする、円卓処理後の席番号を格納する変数
長テーブルのうなぎ屋
下記の問題をプログラミングしてください。
東京の下町に長テーブルで有名な老舗うなぎ屋がありました。
そのうなぎ屋にはとても大きい長テーブルがあり、テーブルの周りにn個の座席が配置されています。
座席には、時計回りに1, 2, …, nと番号が振られています。
座席はテーブルの周りに配置されているので、座席番号nの座席と1の座席は隣接しています。(下記図を参照の事)
今、m個のグループの人達が座席に順番に座りに来ます。i番目(1≦i≦m)のグループの人数をa_i人とします。
彼らは、長テーブルに並んだ座席の内、ある連続するa_i個の座席に一斉に座ろうとします。
ただしお客さんは江戸っ子なので、それら座席のうち、いずれか一つでも既に先客に座られている座席があった場合、
一人も座らずにグループ全員で怒って帰ってしまいます。江戸っ子は気が早いんでぃ。
入力では、i番目のグループが座ろうとする連続した座席の位置は、整数b_iにより指定されます。
i番目のグループは、座席番号b_iの座席を始点として、そこから時計回りにa_i個分の座席に座ろうとします。
最後のグループが座りに来た後、無事に長テーブルの座席に着席出来ている人数を出力するプログラムを作成してください。
入力される値
入力はm+1行から成ります。
1行目にはn(座席数)とm(グループ数)が半角スペース区切りで入力されます。
i+1行目(1≦i≦m)には2個の整数a_i(グループの人数)とb_i(着席開始座席番号)が半角スペース区切りで入力されます。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
期待する出力
最後のグループが座りに来た後、無事に座席に着席出来ている人数を1行で出力してください。
条件
すべてのテストケースにおいて、入力される値は以下の条件を満たします。
1 ≦ n ≦ 100
1 ≦ m ≦ 100
1 ≦ a_i ≦ n
1 ≦ b_i ≦ n
入力例1
6 3
3 2
1 6
2 5
出力例1
4
入力例2
12 6
4 6
4 8
4 10
4 12
4 2
4 4
出力例2
12