版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
1.题目描述
小米食堂每年都会举办一次厨艺大赛,假设参赛的厨师一共有n位(n < 1000),比赛结束后没有公布评分,但是站在领奖台上的一排厨师中每位厨师都能看到与自己相邻的厨师(左或者右)里评分比自己低(看不到比自己分数高的人的分数)的评分。比赛结束之后要发奖金,以1K为单位,每位厨师至少会发1K的奖金,另外,如果一个厨师发现自己的奖金没有高于比自己评分低的厨师的奖金,就会不满意,作为比赛组织方,小米食堂至少需要发放多少奖金才能让所有厨师满意。
输入描述:
每组数据为n+1个正整数单空格分割,其中第一个数为参赛厨师的人数,后面n个数为每位厨师的得分(0-100)
输出描述:
输出至少需要多少K的奖金
2.解题思路
从左至右,看自己左侧的厨师分数,比自己小的,在他的基础上加一
从右至左,看自己右侧的厨师分数,比自己小的,max(自己,右侧+1)
3.代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sr = new Scanner(System.in);
String str = sr.nextLine();
String[] arr = str.split("\\s+");
int a[] = new int[arr.length-1];
for(int i = 0;i<a.length;i++){
a[i] = Integer.parseInt(arr[i+1]);
}
System.out.println(solution(a));
}
private static int solution(int[] arr) {
int bonus[] = new int[arr.length];
for(int i = 0;i<arr.length;i++){
bonus[i] = 1;
}
//从左到右看,从第二个到最后一个数的更新
//看自己左侧的厨师分数,比自己小的,在他的基础上加一
for(int i = 1;i<=arr.length-1;i++){
//如果右边的数大于左边的数,右边的数 = 左边的数 + 1
if(arr[i]>arr[i-1]){
bonus[i] = bonus[i-1] + 1;
}
}
//从右到左看,从第1个到倒数第二个的更新,
//看自己右侧的厨师分数,比自己小的,max(自己,右侧+1)
for(int j = arr.length-2;j>=0;j--){
if(arr[j]>arr[j+1]){
bonus[j] =Math.max(bonus[j+1]+1,bonus[j]);
}
}
//计算得的数
int res = 0;
for(int i = 0;i<bonus.length;i++){
res +=bonus[i];
}
return res;
}
}