LoginSignup
0
0

More than 5 years have passed since last update.

POH Lite4 エンジニアでも恋がしたい-転職初日にぶつかった女の子が同僚だった件 ミッション3

Last updated at Posted at 2014-12-20

ミッション1 / ミッション2 / ミッション3 / 共通解

<?php
    $input = file('php://stdin', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);

    $una = array_shift($input);
    $una = explode(' ', $una);
    $max = 0;

    for($i=0; $i<$una[1]; $i++){
        $tmp =  array_sum(array_slice($input, $i, $una[0]));
        if($tmp > $max){
            $max = $tmp;
        }
    }
    print($max);

問題文にある解き方をそのままなぞっただけです。
とっても簡単。

https://paiza.jp/poh/enkoi-ending/e9dcd311
なん…だと!?
単純にやり過ぎたようだ。
答えは合ってるはずだが、効率が悪すぎてタイムオーバーになってしまいました。
もう少し効率の良い方法を考えてみましょう。

<?php
    $input = file('php://stdin', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);

    $una = array_shift($input);
    $una = explode(' ', $una);
    $now =  array_sum(array_slice($input, 0, $una[0]));
    $max = $now;

    for($i=$una[0]; $i<$una[1]; $i++){
        $now = $now + $input[$i] - $input[$i-$una[0]];
        if($now > $max){
            $max = $now;
        }
    }
    print($max);

https://paiza.jp/poh/enkoi-ending/5d116982
見事にハワイでハネムーンをゲットしました。

動作をサンプルで解説します。
まず左端の4+5+1=10点を前提として計算、MAXも10点と仮置きし、ここをスタート地点とする。
次に右隣の10点をプラス、左端の4点をマイナスすると、これが次の5+1+10=16点となる。
現在のMAX10点を超えているので最大値を更新。
次に右隣の3点をプラス、左端の5点をマイナスすると、これが次の1+10+3=14点となる。
現在のMAX16点以下なのでそのまま。
これを右端に移動するまで繰り返す。

最初のやつに比べて計算量が激減し、全テストケースを時間内に解くことができました。
というわけで、今回は最後まで簡単でした。

しかし正直、このゲーム絶対つまらないだろ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0