paiza スキルチェック過去問セット「日別訪問者数の最大平均区間(large) PHP編」解答一例

人様のコードを切り張りして通したので、自分でまだ理解が追い付いていないのですが
一応置いておきます。

入力データがおそらく巨大で、累積和とか区間和を使わないとタイムオーバーになる仕掛け。

<?php
    // 自分の得意な言語で
    // Let's チャレンジ!!

    $s = explode(" ",trim(fgets(STDIN)));
    $num = $s[0];//全体の日数
    $cam_days = $s[1];//キャンペーンの日数
    
    $days = explode(" ",trim(fgets(STDIN)));//日ごとの訪問数
    //print_r($days);


    //累積和さん
    $hoge_sum[0] = 0;
    //print_r($hoge_sum);
    
    for($i=0; $i<$num; $i++){
        $hoge_sum[$i+1] = $hoge_sum[$i]+$days[$i];
    }
    //print_r($hoge_sum);
    
    //累積和を引いて区間和を出す
    $people_count = [];
    for($i = $cam_days; $i < $num + 1; $i++){
        $foo = $hoge_sum[$i] - $hoge_sum[$i - $cam_days];
        $people_count[] = $foo;
    }
    
    //print_r($people_count);
    
    $max = max($people_count);//最大値
    //echo($max."\n");
    
    $max_num = 0;//reset キャンペーンを行った期間の候補数
    
    //最大値をもっている日程を探す
    foreach($people_count as $key=>$value){
        if($value==$max){
            $max_num++;
            $answer[]=$key;
        }
    }
    echo($max_num." ");//解答の1つめ
    //print_r($answer);
    
    $first_answer = $answer[0]+1;//候補の中で最も早い開始日/配列が0はじまりのため1を足す
    echo($first_answer."\n");//解答の2つめ

?>
あぶらぼうず
困惑のアブラボウズ

paiza スキルチェック過去問セット

https://paiza.jp/works/mondai/skillcheck_archive/problem_index?language_uid=php
1+

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です