一、问题描述
公司职员坐成一排;每个人都至少发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 }
四、说明
做题的时候没有写出来,是后面写的,所以不确定是否能通过所有测试用例。如果有错误的地方,希望大家指教和探讨