蓝桥杯 分糖果

问题描述

有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:

每个小朋友都把自己的糖果分一半给左手边的孩子。
  一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
  反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
  你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。

输入格式

程序首先读入一个整数N(2<N<100),表示小朋友的人数。

接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)

输出格式

要求程序输出一个整数,表示老师需要补发的糖果数。

样例输入

3

2 2 4

样例输出
4

//是被右边人给的糖果之前 自己拥有的糖果给左边的人 再加上被右边人给的糖果

同时给左边的人糖果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<iostream>
#define MAX 1000+2
using namespace std;
int main(){
int n;
int a[MAX];

cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
int cnt=0;
while(1){
int flag=1;
int tp=a[0];
for(int i=1;i<n;i++){
if(a[i]!=tp) {
flag=0;
}
}
if(flag==1) {
cout<<cnt<<endl;
return 0;
}
int tmp=a[n-1]/2;
int t;
for(int i=0;i<=n-1;i++){
t=a[i]/2;
a[i]=t+tmp;
tmp=t;
}
for(int i=0;i<n;i++){
if(a[i]%2) {
a[i]+=1;
cnt++;
}
}
}
}

错误代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream>
#define MAX 1000+2
using namespace std;
int main(){
int n;
int a[MAX];

cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
int cnt=0;
while(1){
int flag=1;
int tmp=a[0];
for(int i=1;i<n;i++){
if(a[i]!=tmp) {
flag=0;
//break;
}

}
if(flag==1) {
cout<<cnt<<endl;
return 0;
}

for(int i=0;i<=n-1;i++){
a[(i-1+n)%n]+=a[i]/2;
a[i]-=a[i]/2;

}
for(int i=0;i<n;i++){
if(a[i]%2) {
a[i]+=1;
cnt++;
}
}
}
}

参考博客

https://blog.csdn.net/qq_34845121/article/details/67655064