题意:
有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
1. 每个小朋友都把自己的糖果分一半给左手边的孩子。
2. 一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
3. 反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
给出每个小朋友的初始糖果数,求老师一共需要补发多少个糖果。
思路:
由于数据量不大,这道题可以直接模拟。
注意:
1. 小朋友给左边糖果时分的一半是自己原先糖果的一半,而不是接受过右边小朋友糖果后的一半。
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<stack>
#include<queue>
#include<utility>
#include<vector>
#include<cmath>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
#include<sstream>
using namespace std;
typedef long long LL;
int N;
int num[110];
int give[110];
bool Judge(){
int n = num[0];
for(int i=1; i<N; i++){
if(n != num[i]) return false;
}
return true;
}
int main()
{
while(scanf("%d", &N) == 1){
for(int i=0; i<N; i++){
scanf("%d", &num[i]);
}
int ans = 0;
while(!Judge()){
for(int i=0; i<N; i++){
num[i] /= 2;
give[i] = num[i];
}
for(int i=1; i<N; i++){
num[i] += give[i-1];
}
num[0] += give[N-1];
for(int i=0; i<N; i++){
if(num[i]&1){
num[i]++;
ans++;
}
}
}
printf("%d\n", ans);
}
return 0;
}