题目描述
问题描述
有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
每个小朋友都把自己的糖果分一半给左手边的孩子。
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
输入
程序首先读入一个整数N(2< N< 100),表示小朋友的人数。
接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
输出
要求程序输出一个整数,表示老师需要补发的糖果数。
样例输入
3
2 2 4
样例输出
4
分析:
我们的任务就是要把当前数(必须为偶数)除半后加上他后面的那个数(必须为偶数)的一半,如果说最后一个数的话,加上的应该是第一个数,相当于一个循环的数组知道数组中的所有的数全部相等为止。
但是我们要注意的是,第一个数是第一个变换的,当我们进行到最后一个数的时候第一个数的值已将改变了,而我们要加上的是没有变换之前的第一个数。所以最后一个数要单独处理。
代码:
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
int main()
{
int n;
int a[101];
int i,sum=0,op;
scanf("%d",&n);
for( i=0;i<n;i++)
scanf("%d",&a[i]);
while(1)
{
//首先应该判断当前数组中的元素是否完全相等,完全相等就直接输出老师补发的糖果个数,否则的话就要接着进行
op=a[0];//都与第一位进行比较
for( i=1;i<n;i++)
{
if(a[i]!=op)
{
break;
}
}
if(i==n)//中间没有break,相当于所有的数全部相等
{
printf("%d",sum);
break;
}
//如果当前的数组中有奇数,则加1变为偶数,老师步伐的糖果数加1
for(i=0;i<n;i++)
{
if(a[i]%2!=0)
{
a[i]=a[i]+1;
sum++;
}
}
op=a[0];//要先把没有变换前的a[0]的值取出来,否则后面就变了
for( i=0;i<n-1;i++)
{
a[i]=a[i]/2+a[i+1]/2;
}
a[n-1]=a[n-1]/2+op/2;//最后一个人应该是第一个人给他
}
return 0;
}