字節跳動研發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