發獎金
阿新 • • 發佈:2018-10-22
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"; }
發獎金