競技プログラミングのためのF#入門
1 2 3 4 |
|
これも前問A06と同じくどうループを減らすかが問題です. このデータ数で速い言語なら無理を通せるものの, 明らかな無駄は省くべきでもあります. さらにA06と同じくあとの処理を綺麗に書くための前処理もポイントです. もちろん前回と違って今回は各日の出席者数の勘定で, 何日から何日までの指定ではない点も注意が必要です.
結論から言えば入力Ia
を使ってi
日に何人の出入りがあったかを勘定します.
li
を使ってi
日に人が一人入った.ri
を使ってi+1
日に人が一人抜けた.こう考えて出欠を管理すれば計算できます. 上記のri
の処理でi+1
を考えているため, 配列で処理する場合は配列外参照の実行時エラーを起こさないように注意しましょう. 特にri = D
がありるため, 途中に出てくる配列の要素数はD+1
にしなければいけません. 実際私は提出コードで一回RE
を出してしまいました. テストケースをきちんと考えれば防げた問題でもあり, テストケース生成の重要性もわかります.
方針で書いた内容を素直に実装します.
1 2 |
|
Array.create (D+1)
が重要です. 配列の添字は1
-originではなく0
-originである点にも注意しましょう.
これも単純にscan
で十分です.
1 2 3 |
|
今回も初項0
が余計です. さらにD+1
で配列を生成したため最終項も余計です. スライスで次のように書けばいいでしょう.
1 2 3 4 |
|
ここも0
-originの配列で後ろから二つめを取るにはXa.Length-2
であって, Xa.Length-1
ではない点に注意します.