/*
这里是过程分析
3
2 2 4
2 3 3
2 4 4 补给 2
3 4 3
4 4 4 补给 4
*/
#include<stdio.h>
#include<string.h>
int N;//小朋友的个数
int tang[105];
int bu_tang = 0;//补给的糖果数
//调试用的函数
void printf_list()
{
int i;
for(i = 0; i < N; i++)
{
printf("%d\t", tang[i]);
}
printf("\n");
}
//补给 如果糖果个数为奇数则补给一颗糖果
void buji()
{
int i;
for(i = 0; i < N; i++)
{
if(tang[i] % 2 == 1)
{
tang[i]++;
bu_tang++;
}
}
}
void fenpei()
{
int x = tang[0] / 2;
tang[0] = tang[0] / 2;
int k;
for(k = 1; k < N; k++)
{
tang[k] = tang[k] / 2;
tang[k - 1] = tang[k] + tang[k - 1];
}
tang[N - 1] = x + tang[N - 1];
}
//检查糖果是否相等
int is_same()
{
int i;
for (i = 1; i < N; i++)
{
if(tang[i - 1] != tang[i])
{
return 0;
}
}
return 1;
}
int main()
{
scanf("%d", &N);
memset(tang, 0, sizeof(tang));
int j;
for(j = 0; j < N; j++)
{
scanf("%d", &tang[j]);
}
do{
buji();
fenpei();
printf_list();//不是必须,用来调试
} while(!is_same());
printf("%d\n", bu_tang);
return 0;
}
逻辑在代码中描述很清楚了,若是有比笔者更好的方法,希望一起讨论