题目描述
有一群小朋友围着圈坐,初始每个人手中都有一定数量的糖。当老师吹一下哨,每个小朋友都将自己的糖果分一半给自己右边的小朋友。分完后,如果有人有奇数个糖,那么老师会再给他一颗糖。现输入小朋友的个数和他们初始的糖果数,请输出老师需要吹对少次哨
题解
由于题目没给数据范围,总是害怕直接模拟会T。一直在想要不要用二分。后来发现直接模拟可以过 = = 。
AC代码
#include <cstdio>
#include <cstring>
using namespace std;
int a[10000];
int n;
int solve(){
int cnt = 0;
bool done;
while(1){
done = true;
for(int i = 0; i<n; i++)if(a[i]!=a[(i+1)%n]){
done = false;
break;
}
if(done) break;
cnt++;
int temp = a[0],b;
for(int i = 0; i<n-1; i++){
b = (a[i]+a[i+1])/2;
a[i] = (b&1)?b+1:b;
}
b = (a[n-1]+temp)/2;
a[n-1] = (b&1)?b+1:b;
}
return cnt;
}
int main(){
while(~scanf("%d",&n) && n){
for(int i = 0; i<n; i++)
scanf("%d",a+i);
printf("%d ",solve());
printf("%d\n", a[0]);
}
}