字节跳动研发2019年(2020届)笔试题(3)-发奖金


一、问题描述
公司职员坐成一排;每个人都至少发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 }

 

四、说明
       做题的时候没有写出来,是后面写的,所以不确定是否能通过所有测试用例。如果有错误的地方,希望大家指教和探讨


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM