分糖果
算法描述:
有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
每个小朋友都把自己的糖果分一半给左手边的孩子。
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
【格式要求】
程序首先读入一个整数N(2~N~100),表示小朋友的人数。
接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
要求程序输出一个整数,表示老师需要补发的糖果数。
输入样例:
3
2 2 4
输出样例:
4
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
代码如下:
#include <cstdio>
const int maxn = 100 + 10;
int a[maxn]; // 保存每个人手里的糖
int main() {
int n;
while(scanf("%d", &n)==1) {
for(int i=1; i<=n; ++i) {
scanf("%d", &a[i]);
}
int ans = 0;
for(;;) { // 一直游戏直到每个人手里的糖数目一样
int ok = true; // ok = true表示每个人手里的糖一样
for(int i = 1; i<n ; i++) {
if(a[i] != a[i+1]) { // 发现跟她旁边的人手里的糖数目不一样
ok = false;
break; // 跳出最靠近他的循环
}
}
if(ok) break;
int tmp = a[1];
for(int i=2; i<=n; i++) {
a[i-1] += a[i]/2; // 前面的一个人可以拿到后面的人的一般
a[i] /= 2; // 后面的一般给了前面
}
a[n] += tmp/2;//表示第一个人给最后一个人一般
a[1] -= tmp/2;
// 补发糖
for(int i=1; i<=n; i++) {
if(a[i] % 2==1) { // 拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数
a[i]++;
ans++;
}
}
}
printf("%d\n", ans);
}
return 0;
}
输出结果:
3
2 3 4
4