笔试题:发奖金(搜狐2016研发笔试题)
题目:公司进行了一次黑客马拉松大赛,全公司一共分为了N个组,每组一个房间排成一排开始比赛,比赛结束后没有公布成绩,但是每个组能够看到自己相邻的两个组里比自己成绩低的组的成绩,比赛结束之后要发奖金,以1w为单位,每个组都至少会发1w的奖金,另外,如果一个组发现自己的奖金没有高于比自己成绩低的组发的奖金,就会不满意,作为比赛的组织方,根据成绩计算出至少需要发多少奖金才能让所有的组满意。
输入描述:
每组数据先输入N,然后N行输入N个正整数,每个数表示每个组的比赛成绩。
输出描述:
输出至少需要多少w的奖金
示例1
输入
10
20
32
12
32
45
11
21
31
41
33
输出
20
解题思路:
虽然有个公众号上经常发这种题目,但是自己好长时间没做了。今天有些无聊,还是做个题吧!首先对于此题,求最优解。刚一开始想的是可不可以通过来回遍历达到要求后然后终止循环,但是感觉还是比较麻烦。总之要达到的目的是,相邻的成绩高的那的钱肯定比成绩低的钱多。那么是否可以通过一次主要遍历就解决问题呢?
那么就开始第一次遍历:
我可以给第一个开始的小组置初值为1万,然后对当前下标小组和下一个下标小组(也就是相邻)分数进行对比。无非有三种情况大于,小于和等于。其中如果当前小组分数小于下一个小组的成绩,因为单位为1万,则用下一个小组的奖金为当前小组奖金加一,因为当前小组的奖金不变,所以不会影响之前遍历过的小组奖金情况时候还符合题目中要求的情况。然后当等于时,则是两小组奖金数相等就可以。关键是当前小组奖金分数大于下一小组的分数时,因为此时可能会改动之前已经遍历过的小组的奖金数。如果大于的话,下一小组奖金数为一万,然后开始从当前小组向前检查。以当前小组为标准,如果分数大于后一个小组,而奖金数却不大于后一个小组的话则让其奖金加一。
大致思路就是这样!开始编码调试。。。 。。。
实现代码:
#include <stdio.h> int main() { int n,i,k; scanf("%d",&n); //输入个数 int number[n]; int money[n]; for(i=0;i<n;i++) scanf("%d",&number[i]); //每组成绩 money[0] = 1 ; for ( i = 0; i < n - 1; ++ i ) { if ( number[i] < number[i + 1] ) { //当前分数小于下一个分数 money[i + 1] = money[i] + 1 ; } else if ( number[i] == number[i + 1] ) { //等于时 money[i + 1] = money[i] ; } else { //大于时 money[i + 1] = 1 ; //将下一个初值设为1 for ( k = i + 1; k >= 0 ; -- k ) { //检查i(从i开始),是否需要增加奖金 if ( number[k - 1] > number[k] && money[k - 1] <= money[k] ) money[k - 1] += 1 ; } } } int result = 0 ; for ( i = 0; i < n; ++ i ) { result += money[i] ; } printf("%d\n",result); return 0; }
调试成功!