问题描述
有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
每个小朋友都把自己的糖果分一半给左手边的孩子。
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
解题思路
数据范围小,直接暴力模拟,每次所有小朋友糖果数量减半,把自己的一半给左手边的孩子,注意,小朋友围成一圈,他的左手边,应该是数组下标向右。最右边的孩子需要把一半糖果分给第一个小朋友。
代码部分
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int a[105], b[105];
int n;
scanf("%d", &n);
for(int i = 0; i < n; ++ i)
scanf("%d", &a[i]);
int ans = 0;
while(1)
{
int tmp = a[0];
bool f = true;
for(int i = 0; i < n; ++ i)
{
if(a[i] != tmp)
f = false;
b[i + 1] = a[i] / 2;
a[i] /= 2;
}
if(f)
break;
for(int i = 1; i <= n; ++ i)
{
tmp = i % n;// 处理圈的问题
a[tmp] += b[i];
if(a[tmp] % 2 != 0)
{
ans ++;
a[tmp] ++;
}
}
}
printf("%d\n",ans);
return 0;
}