问题描述
有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
每个小朋友都把自己的糖果分一半给左手边的孩子。
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
输入格式
程序首先读入一个整数N(2<N<100),表示小朋友的人数。
接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
输出格式
要求程序输出一个整数,表示老师需要补发的糖果数。
样例输入
3
2 2 4
样例输出
4
我的解法
#include<iostream>
using namespace std;
int a[10000],b[10000];
int d = 0;
int count1 = 3;
int c = 0;
int check()
{
for (int i = 0; i < count1 - 1; i++)
{
if (a[i] != a[i + 1])
return 0;
else
continue;
}
return 1;
}
int main()
{
cin >> count1;
for (int i = 0; i < count1; i++)
{
cin >> a[i];
}
do
{
for (int i = 0; i < count1; i++)
{
b[i] = a[i] / 2;
}
a[count1 - 1] = a[count1 - 1] / 2 + b[0];
for (int i = 0; i < count1-1; i++)
{
a[i] = a[i] / 2 + b[i + 1];
}
for (int i = 0; i < count1; i++)
{
if (a[i] % 2 != 0)
{
a[i]++;
d++;
}
}
} while (!check());
cout << d;
return 0;
}
这个题要把题意理解正确,分糖果的时候是每个人同时拿一半糖果,而不是一个人拿完再给另外一个人,另外一个人拿着这份糖果再给另一个人。
还有一点是要注意是向左,也就是从后往前加,第一个人给最后一个人加。
代码细节注意
for (int i = 0; i < count1-1; i++)
{
a[i] = a[i] / 2 + b[i + 1];
}
这里的下标和循环结束条件,下标有i+1,循环往后退一个变成count-1.
同样注意数组下标与循环的结束条件
注意验证一个数组是否不等的写法
int check()
{
for (int i = 0; i < count1 - 1; i++)
{
if (a[i] != a[i + 1])
return 0;
else
continue;
}
return 1;
}