「日別訪問者数の最大平均区間(large) Python3編」でやったこと


対象

これは paizaランク A 相当の練習問題としてここにあった問題の解答の解説となる。
内容は極めて初心者向けです。

概要

この問題は計算を軽量化することがいかに重要かを体感するものであった。

コード

#入力
days, span = map(int, input().split())
visitors = list(map(float, input().split()))

#初期化・第1区間の計算
earliest_day = 0
num_of_candidate = 1
sum_visitor = sum(visitors[0:span])
largest_ave_visitor = sum_visitor / span

#第2区間以降の計算と判定
for i in range(1, days-span+1):
    sum_visitor = sum_visitor - visitors[i-1] + visitors[i+span-1] #前区間の計算結果を用いた今区間の計算
    ave_visitor = sum_visitor / span
    if ave_visitor == largest_ave_visitor: #今区間平均値が、現在の最大平均値と同じであれば
        num_of_candidate += 1 #候補数をカウント
    elif ave_visitor > largest_ave_visitor:  #今区間平均値が、現在の最大平均値より大きければ、
        earliest_day = i #インデックス番号を更新
        largest_ave_visitor = ave_visitor #最大平均値の更新
        num_of_candidate = 1 #候補数のリセット

#出力
print(num_of_candidate, earliest_day+1) #earliest_dayはインデックス番号なので1を加えて日付に直す

感想

わかりやすく変数名を定義するのを心掛けた。

始めは愚直に逐一平均値を求めたが、8回目のテストでタイムアウトをもらったので、
前区間の結果から今区間を計算する手法をとった。

また、sum_visitorという変数を使わずにsum_visitorを求める際、largest_ave_visitorをspan倍する方法を取ろうとしたが、
小数点の下の方で変なことになりそうだったので、無難にsum_visitorを定義し、整数で取り扱うこととした。