一、問題描述
公司職員坐成一排;每個人都至少發100的獎金;根據工作年限發獎金,如果a的工作年限比鄰座b的工作年限高,則a的獎金至少比b多100;計算最少要發出多少獎金。
輸入描述:
第一行只有一個正整數N(1<=N<=1000),表示員工人數
第二行有N個正整數,代表每個員工的入職年限,排列順序為員工座位順序
輸出描述:
最低獎金總數
例子:
輸入:
4
3 9 2 7
輸出:
600
輸入:
3
1 1 1
輸出:
300
二、解題思路
如圖所示:

1、先找到工作年限的谷點(紅點處),將該處的獎金設為100;
2、依次從每個紅點處的后一個開始,向右掃描(藍色箭頭方向),如果b的工齡高於b-1,將其獎金設為比b-1多100,工齡相同則設為與b-1相等,直到b的工齡低於b-1為止
3、依次從每個紅點處的前一個開始,向左掃描(黃色箭頭方向),如果b的工齡高於b+1, 將其獎金設為b+1多100,工齡相同則設為與b+1相等,如果該位置已經在步驟2中設置過獎金,則選擇按照步驟2計算和按照步驟3計算得到的結果中值更大的一個來設置,知道b的工齡低於b+1為止
三、參考代碼
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 5 using namespace std; 6 7 8 int main() 9 { 10 int n; 11 cin >> n; 12 vector<int> workAge(n, 0); 13 for (int i = 0; i < n; i++) { 14 cin >> workAge[i]; 15 ; } 16 if (n == 1) { 17 cout << 100 << endl; 18 return 0; 19 } 20 vector<int> bonus(n,0); 21 for (int i = 0; i < n; i++) { 22 if (i == 0) 23 bonus[i] = workAge[i] <= workAge[i + 1]?100:0; 24 else if (i == n - 1) 25 bonus[i] = workAge[i] <= workAge[i - 1]?100:0; 26 else if (workAge[i] <= workAge[i - 1] && workAge[i] <= workAge[i + 1]) 27 bonus[i] = 100; 28 } 29 30 for (int i = 0; i < n; i++) { 31 if (bonus[i] == 100) { 32 int j = i+1; 33 while (j<n && workAge[j]>=workAge[j-1]) 34 { 35 if (workAge[j ] == workAge[j-1]) 36 bonus[j] = bonus[j - 1]; 37 else 38 bonus[j] = bonus[j - 1] + 100; 39 j++; 40 } 41 i = j - 1; 42 } 43 } 44 for (int i = 0; i < n; i++) 45 cout << bonus[i] << " "; 46 cout << endl; 47 48 for (int i = n - 1; i >= 0; i--) { 49 if (bonus[i] == 100) { 50 int j = i - 1; 51 while (j>=0 && workAge[j]>=workAge[j+1]) 52 { 53 if (workAge[j ] == workAge[j + 1]) 54 bonus[j] = (bonus[j] == 0) ? bonus[j + 1] : max(bonus[j + 1], bonus[j]); 55 else 56 bonus[j] = (bonus[j] == 0) ? bonus[j + 1]+100 : max(bonus[j + 1]+100, bonus[j]); 57 j--; 58 } 59 i = j + 1; 60 } 61 } 62 63 for (int i = 0; i < n; i++) 64 cout << bonus[i] << " "; 65 cout << endl; 66 67 int count = 0; 68 for (int i = 0; i < n; i++) 69 count += bonus[i]; 70 cout << count << endl; 71 }
四、說明
做題的時候沒有寫出來,是后面寫的,所以不確定是否能通過所有測試用例。如果有錯誤的地方,希望大家指教和探討