标题:分糖果
有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
每个小朋友都把自己的糖果分一半给左手边的孩子。
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
【格式要求】
程序首先读入一个整数N(2<N<100),表示小朋友的人数。
接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
要求程序输出一个整数,表示老师需要补发的糖果数。
例如:输入
3
2 2 4
程序应该输出:
4
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
思路解析:
在遇到这个题目时候,首先看到一圈,便想到了 约瑟夫环的问题,都是对数字一圈的进行循环加减,进行模拟过程即可
代码实现:
public static void send(int[]a,int nums[],int n) {
//a为初始的每个小朋友的糖果数,
//nums为每个小朋友在一轮分糖结束以后能够获得的糖果数
//n为多少个小朋友
boolean k = false;
int time = 0;
for (int i = 1,f = 1;!k;i++,f++) {
nums[(i-1)%n]+=a[(i)%n]/2;
nums[i%n] -= a[(i)%n]/2;
// if (a[(i)%3]%2!=0) {//这里就是踩坑
// a[(i)%3]++;
// time++;
// }
// if (a[(i+1)%3]%2!=0) {
// a[(i+1)%3]++;
// time++;
// }
if(f%n==0) {
k = true;
for (int j = 0;j<a.length;j++) {
a[j]+=nums[j];//对糖果进行更新
nums[j]=0;
}
for (int j = 0;j < a.length;j++) {
if (a[j]!=a[0])k = false;
if(a[j]%2!=0) {//若小朋友的糖果更新以后仍然为奇数
a[j]++;
time++;
}
}
}
}
System.out.print(time);
}
反思总结:
- 读题不认真,开始读题时候没有读到一圈。。
- 本题有一个大坑,当时在写的时候认为每次小朋友分到糖果和减少糖果以后都是及时参加到下一个小朋友身上参与瓜分,导致在有的小朋友在进行获得糖果后成为奇数,参与自己瓜分时候无法进行,出现一系列的剩余小数问题,之后老师将剩余数进行补齐后,又重回初态,成为无限瓜分。
本文介绍了蓝桥杯省赛中关于分糖果的问题,涉及到约瑟夫环问题的解决思路。作者首先从约瑟夫环的角度出发,解析了如何模拟分糖果的过程。在代码实现部分,作者分享了遇到的错误,即错误地认为每个小朋友在获得或减少糖果后立即参与下一轮,导致无限循环。最后进行了反思,强调了仔细读题的重要性。
577

被折叠的 条评论
为什么被折叠?



