作業一——根據成績計算出至少需要發多少獎金才能讓所有的組滿意。
阿新 • • 發佈:2018-12-10
狐進行了一次黑客馬拉松大賽,全公司一共分為了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; }