【搜狐】根据成绩计 算出至少需要发多少奖金才能让所有的组满意

package com.wt;

/**
 搜狐笔试题

 题目描述
    小狐进行了一次黑客马拉松大赛,全公司一共分为了N个组,每组一个房间排成一排开始比赛,
    比赛结束后没有公布成绩,但是每个组能够看到自己相邻的两个组里比自己成绩低的组的成绩,
    比赛结束之后要发奖金,以1w为单位,每个组都至少会发1w的奖金,另外,如果一个组发现自
    己的奖金没有高于比自己成绩低的组发的奖金,就会不满意,作为比赛的组织方,根据成绩计
    算出至少需要发多少奖金才能让所有的组满意。

 输入描述:
    每组数据先输入N,然后N行输入N个正整数,每个数表示每个组的比赛成绩。
 输出描述:
    输出至少需要多少w的奖金

 思路:新建两个数组,第一个数组用来存储成绩,第二个数组用来存储对应的奖金,第二个数组初始化为1
 */
public class Bonus {
    public static void main(String[] args)
    {
//        int[] score = new int[]{20,32,12,32,45,11,21,31,41,33};
        int[] score = new int[]{50,40,30,50,60,10};
        int[] result = compare(score);
        for(int i = 0;i < result.length;i ++)
        {
            System.out.println(result[i]);
        }
    }
    //传入分数数组
    public static int[] compare(int[] score)
    {
        int[] bonus = new int[score.length];
        //每一队至少发1万奖金,初始化数组
        for(int i = 0;i < score.length;i++)
        {
            bonus[i] = 1;
        }
        for (int i = 0;i < score.length;i ++)
        {
            if(i == 0)
            {
                if(score[0] > score[1])
                {
                    bonus[0] = bonus[1] + 1;
                }
            }
            else if(i == score.length-1)
            {
                if(score[score.length - 1] > score[score.length - 2])
                {
                    bonus[score.length - 1] = score[score.length - 2] + 1;
                }
            }
            else
            {
                //如果大于它左边的成绩
                if(score[i] > score[i -1])
                {
                    //大于左边的成绩,看它的奖金是否也大于左边的
                    if(bonus[i] <= bonus[i -1])
                    {
                        bonus[i] = bonus[i-1] + 1;
                    }
                }
                //如果大于它右边的成绩
                if(score[i] > score[i + 1])
                {
                    //大于它右边的成绩,看它的奖金是否也大于右边的
                    if(bonus[i] <= bonus[i + 1])
                    {
                        //调整奖金
                        bonus[i] = bonus[i + 1] + 1;
                        //调整奖金后,看看前面的奖金是否还满足要求
                        for(int j = i; j > 0;j --)
                        {
                            if(score[j - 1] > score[j])
                            {
                                if(bonus[j - 1] >= bonus[j])
                                {
                                    bonus[j - 1] = bonus[j] + 1;
                                }
                            }
                        }
                    }
                }
            }
        }
        return bonus;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值