解题思路:
首先把每个孩子的糖果放入一个数组a里面,同时把这个a数组复制一遍到b数组,分的时候用。
写一个函数检查是不是每个孩子的糖果相同,如果不同,开始循环分配。
分配的第一步,就是每个孩子的糖果数在原来的基础上减去它的一半(因为要分出一半给左边)
分配的第二步,那个b数组的作用就是错位一下的一半分给上面的那个a数组(原来孩子左边的给他糖果)。 这样就分完了一遍,a中存的就是每个孩子分一半给他左边又从他右边那个孩子那得到的糖果总数。 遍历a数组,有多少奇数,那么老师就需要补发多少糖果。
分配的第三步,计算出奇数个数之后,奇数个数要加1看是否都相等,不相等重新分配。
注意事项:
每一次分配,b数组要保证和a数组一样,即b数组要及时更新。
参考代码:
#include <iostream>
using namespace std;
//判断是否每个孩子糖果一样
int Same(int a[], int len)
{
for (int i=1; i<len; i++)
{
if (a[i]!=a[0])
return 0;
}
return 1;
}
int main()
{
int chnum;
cin >> chnum;
int candy[chnum];
int temp[chnum];
for (int i=0; i<chnum; i++)
{
cin >> candy[i];
temp[i] = candy[i];
}
int cou = 0;
while(!Same(candy,chnum)) //开始分
{
for (int i=0; i<chnum; i++)
{
candy[i] -= candy[i]/2; //分出自己的一半给左边
}
for (int i=0; i<chnum; i++)
{
candy[(i+1)%chnum] += temp[i]/2; //接收右边那个孩子的一半
}
for (int i=0; i<chnum; i++)
{
if (candy[i]%2!=0) // 找奇数个数
{
cou++;
candy[i] += 1;
}
}
for (int i=0; i<chnum; i++) //更新b数组
{
temp[i] = candy[i];
}
}
cout << cou;
return 0;
}
0.0分
12 人评分