7-73 n个小朋友分糖果

7-73 n个小朋友分糖果

为了培养小朋友们分享的意识,老师教小朋友做分糖果的游戏,把自己带的糖果分给其他小朋友。

首先,全班 n 个小朋友围成一个大圆圈,按排列顺序依次给他们编号 1,2,…,n。然后,从 1 号小朋友开始,将自己的糖果平均分成三份(如果有多余的糖果则立即吃掉),自己保留一份,其余两份分别分给与他相邻的两个小朋友。接下来按照编号顺序,2 号,3 号,4 号,…,直到 n 号小朋友都这样做。

问经过一轮分糖果游戏,每个小朋友手上分别有多少个糖果?

输入格式:

第一行为小朋友人数 n,保证 3≤n≤30。
第二行为空格隔开的 n 个正整数,依次表示游戏开始时按编号从 1 到 n 的顺序每个小朋友手上的糖果数。

输出格式:

在一行中输出空格隔开的 n 个整数,依次表示游戏结束时按编号从 1 到 n 的顺序每个小朋友手上的糖果数。

输入样例:

3
3 3 3

输出样例:

 3 2 1
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    int arr[n];

    // 初始糖果
    for (int i = 0; i < n; ++i) {
        int temp;
        scanf("%d", &temp);
        arr[i] = temp;
    }
    // 游戏开始
    for (int i = 0; i < n; ++i) {
        if (arr[i] >= 3) {
            if (i == 0) {
                arr[i + 1] += arr[i]/3;
                arr[n-1] += arr[i]/3;
            } else if (i == n - 1) {
                arr[0] += arr[i]/3;
                arr[i - 1] += arr[i]/3;
            } else {
                arr[i + 1] += arr[i]/3;
                arr[i - 1] += arr[i]/3;
            }
            arr[i] /= 3;
        }
    }
    // 游戏结束输出糖果数
    for (int i = 0; i < n; ++i) {
        printf(" %d",arr[i]);
    }
    return 0;
}

思路

1. 没写思路几乎约等于没有的注释能看懂也是真的厉害呀,这题我是早就写完了,回头来看自己都看不太懂题目,相当于重新做一遍写个思路

2. 在读题的时候有一个问题如果手上的糖果不足三个怎样分成三分呢,题目好像也没有告知,所以起初在做题的时候判断在糖果数至少为三个
  的时候再进行分糖这个操作,根据这个思路提交出来的结果也是这样,所以就默认题目是这么回事吧
  
3. 本文采用数组的方式表示一个圈,假想一下数组第一个和最后一个是挨在一起的吧

4. 讲一下分糖+吃糖这个逻辑,当前小朋友手上的糖数量除3表示每份的糖数,把这个份数加到左右两边小朋友完成分糖操作,无论如何自己的
   糖数是要变成三分之一的即原本的糖除3,所以在分的时候不管自己的,在最后的时候再让自己的糖数变为原本三分之一,就可以少写两个
   
5. 有些人可能就不知道怎么就吃了呢,这里的“吃”理解成c语言“吃”更合适,分糖的时候如果结果不为整数则会把余下的自动丢掉,所以相当于
   也是吃了,这个地方不理解的可以多想一想int类型在做除法,不能整除的时候结果是什么

6. 搞懂了上面的逻辑然后再对特殊情况第一个和最后一个进行处理即可

7. 第一个小朋友右边就是i+1即1(也就是第二个小朋友),左边就是最后一个,即数组长度减一

8. 最后一个小朋友的左边即i-1,右边就是数组的第一个即arr[0]

总结:题目看起来好像难(其实看起来也不难),只需要多想一下就行,如果看了还是有疑问欢迎提问,俺很用心在文章了,真想让你们看懂
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
糖果是一道经典的编程题目,常出现在编程竞赛中,比如蓝桥杯。题目描述如下: 给定一个长度为n的数组,表示n个小朋友的评分。现在需要将糖果分给这些小朋友,要求满足以下条件: 1. 每个小朋友至少分到一个糖果。 2. 评分更高的小朋友比他相邻的小朋友分到的糖果数量更多。 要求:计算最少需要多少个糖果才能满足以上条件。 解题思路: 1. 首先初始化一个长度为n的糖果数组,每个元素都为1,表示每个小朋友至少分到一个糖果。 2. 从左到右遍历评分数组,如果当前小朋友的评分比前一个小朋友高,则将当前小朋友糖果数量设置为前一个小朋友糖果数量加1。 3. 从右到左再遍历一次评分数组,如果当前小朋友的评分比后一个小朋友高,并且当前小朋友糖果数量不大于后一个小朋友糖果数量,则将当前小朋友糖果数量设置为后一个小朋友糖果数量加1。 4. 最后将糖果数组中所有元素的值相加,即为最少需要的糖果数量。 下面是分糖果问题的Python代码示例: ```python def minCandies(ratings): n = len(ratings) candies = * n for i in range(1, n): if ratings[i] > ratings[i-1]: candies[i] = candies[i-1] + 1 for i in range(n-2, -1, -1): if ratings[i] > ratings[i+1] and candies[i] <= candies[i+1]: candies[i] = candies[i+1] + 1 return sum(candies) # 测试样例 ratings = [1, 3, 2, 1, 2, 4, 3] result = minCandies(ratings) print(result) # 输出:12 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Likf(❁´◡`❁)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值