题目详情
有n个小朋友站成一排(编号从0到n-1),每个小朋友有一个rating值,存放在ratings数组中。老师需要给他们分配糖果,每个小朋友至少需要一颗糖果,对于任意相邻的两个小朋友i和i+1,rating值大的必须比rating值小的分配的糖果多(rating相同的没必要分配一样多的糖果)。请计算最少需要多少颗糖果,才能完成上述分配。
输入格式:
多组数据,每组数据第一行是一个正整数n。接下来n行,每行有1个正整数,表示每个小朋友的rating值。所有整数都不超过100000。
输出格式:
每组数据一行,包括一个正整数,表示做少需要的糖果数。
3
1
2
2
输出样例:
4
算法分析:
题目的主要要求就是比较相邻小朋友的ratings值,从而进行操作。由于只要比较相邻元素大小,所以线性遍历数组就可以了,也就是说,只要一重循环。那么问题就来了,这样的遍历结果只能比较 i 和 i + 1元素,i 和 i - 1 是无法比较的(例如第2个小朋友应该同时和第1、3个比较,但实际上只是2先同1比较,再同3比较,不是同时),这就涉及到了更新的问题,即:若ratings[ i - 1 ] > ratings[ i ] > ratings[ i + 1 ] , i - 1 与 i 比较后 ,i 与 i + 1 比较,若改变了 i 的值,则 i 需要重新与 i - 1 做比较,使得第 i - 1 个小朋友糖果数始终 大于 i 的数量。
代码:
import java.util.Scanner;
public class Game {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n; //每组数据小朋友人数
//开始,循环输入多组数据
while((n = input.nextInt()) != 0) {
int[] ratings = new int[n]; //保存输入的ratings值
int tag = 0; //所需要的总糖果数
int[] tango = new int[n]; // 0 ~ n -1每个小盆友的糖果数
//初始化,满足每个小朋友至少一个糖果的要求
for(int i = 0;i < n;i ++) {
ratings[i] = input.nextInt();
tango[i] = 1;
}
//便利小朋友ratings数组,比较相邻ratings大小
for(int i = 0; i < n - 1;i ++) {
if(ratings[i] < ratings[i + 1] && tango[i + 1] <= tango[i])
tango[i + 1] = tango[i] + 1;
else if(ratings[i] > ratings[i+1] && tango[i] <= tango[i + 1]) {
tango[i] = tango[i + 1] + 1;
//向前(i-1)更新
i = (i < 1) ? i : i - 2;
}
}
//计算所有的糖果数
for(int i = 0; i < n;i ++)
tag += tango[i];
//输出
System.out.println(tag);
}
}
}