發獎金

題目描述

 狐進行了一次黑客馬拉松大賽,全公司一共分爲了N個組,每組一個房間排成一排開始比賽,比賽結束後沒有公佈成績,可是每一個組可以看到本身相鄰的兩個組裏比本身成績低的組的成績,比賽結束以後要發獎金,以1w爲單位,每一個組都至少會發1w的獎金,另外,若是一個組發現本身的獎金沒有高於比本身成績低的組發的獎金,就會不滿意,做爲比賽的組織方,根據成績計算出至少須要發多少獎金才能讓全部的組滿意。 

輸入描述:

每組數據先輸入N,而後N行輸入N個正整數,每一個數表示每一個組的比賽成績。

輸出描述:

輸出至少須要多少w的獎金

輸入

10
20 
32 
12 
32 
45 
11 
21 
31 
41 
33

輸出

20


思路:初始化獎金數組爲1,從左往右遍歷成績數組,若是右邊分數大於左邊分數,則將右邊分配的獎金加1(知足大於左邊的需求),從右往左遍歷成績數組,若是左邊分數大於右邊分數,且左邊分配的獎金小於(右邊分配獎金+1),則更新左邊分配的獎金(知足大於右邊的需求)
<?php
function clear( &$moneys )
{
    foreach ($moneys as &$money)
    {
        $money = 1;
    }
}

function main( $num )
{
    $i = 0;
    $scores = array();
    while ($i < $num)
    {
        $scores[] = intval(trim(fgets(STDIN)));
        $i++;
    }
    $moneys = $scores;
    clear($moneys);

   //從左往右遍歷,知足大於左邊的限制
    for ($i = 1; $i < $num; $i++ )
    {
        if ($scores[$i] > $scores[$i-1])
        {
            $moneys[$i] = $moneys[$i-1] + 1;
        }
    }

    //從右往左遍歷,知足大於右邊的限制
    for ($i = $num - 2; $i >= 0; $i--)
    {
        //左邊分數大於右邊分數
        if ( ($scores[$i] > $scores[$i+1]) )
        {
            //左邊分配獎金小於(右邊分配獎金+1)進行更新
            if ($moneys[$i] <= $moneys[$i+1])
            {
                $moneys[$i] = $moneys[$i+1] + 1;
            }
        }
    }
    return array_sum( $moneys );

}
while ($num = trim(fgets(STDIN)))
{
    print main( $num )."\n";
}
相關文章
相關標籤/搜索