欢乐暑假线上编程比赛第四题:分配糖果(解答)

题目详情

有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);
        }
    }
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值