演習課題「日別訪問者数の最大平均区間」
あなたは、とあるウェブサイトを管理していました。
ある連続したk日間、このウェブサイトでキャンペーンを行ったのですが、いつからいつまでの期間に行ったかを忘れてしまいました。
幸い、ウェブサイトを運営していた全n日分のアクセスログが残っており、1日毎(いちにちごと)の訪問者数が分かっています。
とりあえず、連続するk日の中で、1日あたりの平均訪問者数が最も多い期間を、キャンペーンを行った期間の候補だと考えることにしました。
n日分の訪問者数のリストとキャンペーンの日数kが入力されるので、キャンペーンを行った期間の候補数と、候補の中で最も早い開始日を出力してください。
プログラムを実行して、想定どおり出力されれば演習課題クリアです!
※ この演習課題は、Python3でのみ解答することができます。
※ 前回の演習課題とテストケースが異なります。
期待する出力値
1 2
#04:シンプルに問題を解く - その2
前回のチャプターでは、コードをシンプルにしました。
今回は、コードのアルゴリズムを見直して、計算を高速化していきます。
paizaのスキルチェックには、コードの実行時間に制限があります。
コードの実行時間が制限を超えると、タイムアウトとなり、不正解となります。
https://paiza.jp/guide/language
# n と k を取得
input_str = input().split() # スペース区切りで取得
n, k = map(int, input_str)
# a_1, a_2 ... a_n を取得
input_list = input().split()
a_list = list(map(int, input_list))
# キャンペーンの各区間の平均値
average = []
# for i in range(n - k + 1):
# i_average = 0
# for j in range(k): # k日間分足して平均を求める
# i_average += a_list[i]
#
# average.append(i_average / k)
tmp = 0
for i in range(k): # 最初の区間を足す
tmp += a_list[i]
average.append(tmp)
for i in range((n - k + 1) - 1): # 次以降の区間を計算していく
tmp = average[i] + a_list[k + i] - a_list[i]
average.append(tmp)
ans_max = max(average)
ans_first_max = average.index(ans_max)
ans_count = average.count(ans_max)
print(str(ans_count) + " " + str(ans_first_max + 1))
ドキュメントを眺めてみると、新たな発見があるかもしれません。
あまり読んだことがないという方は、一度斜め読みなどをしてみることをお勧めします。
https://docs.python.jp/3/index.html
ぜひチャレンジしてみてください!!!
https://paiza.jp/challenges/ranks/b
日別訪問者数の最大平均区間
下記の問題をプログラミングしてください。
あなたは、とあるウェブサイトを管理していました。
ある連続したk日間、このウェブサイトでキャンペーンを行ったのですが、いつからいつまでの期間に行ったかを忘れてしまいました。
幸い、ウェブサイトを運営していた全n日分のアクセスログが残っており、1日ごとの訪問者数が分かっています。
とりあえず、連続するk日の中で、1日あたりの平均訪問者数が最も多い期間を、キャンペーンを行った期間の候補だと考えることにしました。
n日分の訪問者数のリストとキャンペーンの日数kが入力されるので、キャンペーンを行った期間の候補数と、候補の中で最も早い開始日を出力してください。
入力される値
入力は2行から成ります。
1行目にはnとkが半角スペース区切りで入力されます。
2行目にはn個の整数a_1, a_2, …, a_nが半角スペース区切りで入力されます。a_iはi日目の訪問者数を表します。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
期待する出力
キャンペーンを行った期間の候補数と、候補の中で最も早い開始日を、この順で半角スペース区切りで1行で出力してください。
条件
すべてのテストケースにおいて、以下の条件をみたします。
・1≦n≦1,000
・1≦k≦n
・0≦a_i≦100
入力例1
5 3
1 2 3 2 1
出力例1
1 2
入力例2
10 2
6 2 0 7 1 3 5 3 2 6
出力例2
5 1