首页 > 其他 > 详细

2020-字节跳动笔试(最少工资)

时间:2019-08-12 10:30:28      阅读:318      评论:0      收藏:0      [点我收藏+]

题目描述:

         第一行 n (n<1000)

          第二行n个数, 表示n个人入公司的年限.发工资的规则是这样的, 入职年限高的比入职年限低的工资高, 但所幸的是每一个人只会知道身边两人的工资情况.

问满足此情况的最少工资数.

样例:

       输入1

         4

    1 2 3 2

      输出1

            700 (100, 200, 300)

      输入2

    6

             1 3 3 3 2 1

  输出2:

    1300(100, 300, 300, 200, 100)

核心思想: 谷底(比身边两人入职年限都低的人)一定是100, 然在一个山峰周期内,从谷底向山峰增加, 峰顶是两端所增加的最大值

                

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e3+7;
 4 int y[N], val[N];
 5 int n;
 6 int main()
 7 {
 8     cin>>n;
 9     for (int i=1;i<=n;i++)
10         cin>>y[i];
11     int i=1;
12     while (1) {
13         int s=i;
14         while (i+1<=n&&y[i+1]>=y[i]) i++; // 上升到top
15         int top=i;
16         while (i+1<=n&&y[i+1]<=y[i]) i++; // 下降到i(谷底)
17         // 从山峰两端最低点上升
18         val[s]=100;// 谷底一定是100
19         for (int j=s+1;j<=top;j++)  {   // 左端谷底上升
20             if (y[j]==y[j-1])
21                 val[j]=val[j-1];
22             else
23                 val[j]=val[j-1]+100;
24         }
25         val[i]=max(100, val[i]); // 右端谷底上升, 山峰最高点取两端最大值
26         for (int j=i-1;j>=top;j--) 
27             if (y[j]==y[j+1])
28                 val[j]=max(val[j], val[j+1]);
29             else
30                 val[j]=max(val[j], val[j+1]+100);
31         int j=top-1;
32         while (y[j]==y[top]) // 山峰可能是平的, 不是尖的
33             val[j--]=val[top];
34         if (i==n)
35             break;
36     }
37     int ans=0;
38     for (int i=1;i<=n;i++) {
39         //printf("%d\n",val[i]);
40         ans+=val[i];
41     }
42     printf("%d\n",ans);
43     return 0;
44 }

 

2020-字节跳动笔试(最少工资)

原文:https://www.cnblogs.com/xidian-mao/p/11337961.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!