【スキルチェック過去問題セット 】日別訪問者数の最大平均区間(large) (paizaランク A 相当) 解答例 – PHP編【paiza】

Pocket

【スキルチェック過去問題セット】 > 日別訪問者数の最大平均区間(large) (paizaランク A 相当)
※リンク先へ移動する為には「paiza」へのログインが必要です。

skill-check-past-step8a

日別訪問者数の最大平均区間」と問題内容は同じですがテストケースが違います。今回出題されるテストケースは非常に大きな数値で出題されており前回と同様のプログラムで制限時間内に間に合わず、クリアすることができません。アルゴリズムを考えて処理を軽くするために、”しゃくとり法”を使って解答を導きます。

解答例

解答方針

冒頭でお話した通り、前回の解き方だと時間内に間に合わず、クリアすることができません。
巨大な数値に対応する為に”しゃくとり”法という方法で、処理を軽くします。

 

しゃくとり法

入力例1を参考にしゃくとり法について簡単に説明します。

skill-check-past-step8b

しゃくとり法は、全区間から指定区間を調べる時、加算と減算を繰り返して区間の総数を調べる方法です。
skill-check-past-step8c

図のように指定区間の数値を合計します。指定区間を一つずらしたとき、指定区間の末尾を加算し先頭を減算することで区間の総数を記録します。これを全区間の間繰り返し、総数の最も大きな数値を探し出します。それでは各コードを見ていきます。

 

 

各情報を取得する

各情報を標準入力から取得します。各日の訪問者数を記録している配列「$test」を「$copy」にコピーするのは、後にしゃくとり法を行う際、指定区間の先頭と末尾の加減を行いやすくするために複製しています。

 

しゃくとり法の準備

「$data = array_splice($test,0,$campaign);」で入力例1で例えると「$data」に「1,2,3」が格納され、残りの「2,1」が「$test」に入ります。分割された残りの「$test」の要素数分、しゃくとり法を回すことで、全区間分の指定区間を調べることができます。

 

しゃくとり法を行う

「$count」分、しゃくとり法を行い、配列に記録していきます。

 

キャンペーンの候補数と、もっとも早く訪れる候補の開始日を求める

skill-check-past-step8

エッグ

シェアする

コメントを残す

メールアドレスが公開されることはありません。

コメントする