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]
总结:题目看起来好像难(其实看起来也不难),只需要多想一下就行,如果看了还是有疑问欢迎提问,俺很用心在文章了,真想让你们看懂