1. 程式人生 > >作業一——根據成績計算出至少需要發多少獎金才能讓所有的組滿意。

作業一——根據成績計算出至少需要發多少獎金才能讓所有的組滿意。

狐進行了一次黑客馬拉松大賽,全公司一共分為了N個組,每組一個房間排成一排開始比賽,比賽結束後沒有公佈成績,但是每個組能夠看到自己相鄰的兩個組裡比自己成績低的組的成績,比賽結束之後要發獎金,以1w為單位,每個組都至少會發1w的獎金,另外,如果一個組發現自己的獎金沒有高於比自己成績低的組發的獎金,就會不滿意,作為比賽的組織方,根據成績計算出至少需要發多少獎金才能讓所有的組滿意。 

輸入描述:

每組資料先輸入N,然後N行輸入N個正整數,每個數表示每個組的比賽成績。

輸出描述:

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

示例1

輸入

10
20 
32 
12 
32 
45 
11 
21 
31 
41 
33

輸出

20

思路:

1、先給結果陣列(用於記錄每支隊伍的獎金值的陣列)賦初值為1.

2、然後從左往右遍歷隊伍,如果後面的比前面的成績好,則將該隊伍的值修改為前一個隊伍的獎金值+1;

3、然後從後往前遍歷,如果後一個比前一個的分值低,但是獎金高,則將前一個隊伍的獎金值改為後一個隊伍的獎金+1.

4、遍歷記錄獎金的陣列,獲取獎金總額。

#include<iostream>
#include<vector>
using namespace std;

int minMoney(vector<int> teams){
	if(teams.size()<=0) return 0;
	
	vector<int>money(teams.size(),1);
	int sum=0;
	for(int i=1; i<teams.size(); i++){
		if(teams[i]>teams[i-1]) 
			money[i]=money[i-1]+1;
	}

	for(int i=teams.size()-1;i>=0;i--){
		if(teams[i]<teams[i-1]){
			if(money[i]>=money[i-1])
				money[i-1]=money[i]+1;
		}
	}
    
	for(int i=0; i<teams.size(); i++)
		sum+=money[i];
    
	return sum;
}

int main(){
	int N=0, temp=0;
	vector<int>teams;
	cin>>N;
	while(N--){
		cin>>temp;
		teams.push_back(temp);
	}

	int answer=minMoney(teams);
    cout<<answer;
	return 0;
}