1. 程式人生 > >發獎金

發獎金

class 初始 -- color question 就會 bject 黑客 公司

題目描述

 狐進行了一次黑客馬拉松大賽,全公司一共分為了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"; }

 

發獎金