#include <stdio.h> #include <stdlib.h>
// 执行一轮分发 void distribute(int *a, int n) { int i; int last = a[n - 1]; // 开始前,最后一个人手中的数量 // 第1~倒数第2个人 for (i = 0; i < n - 1; i++) { a[i] /= 2; if (i == 0) a[n - 1] += a[i]; // 第一个人分一半给最后一个人 else a[i - 1] += a[i]; // 其他人分一半给前一个人 } // 最后一个人需要特殊处理 // 他只拿出最开始的一半给倒数第二个人 // 而不是现在手中的一半(现在第一个人已经给了他一部分,不能把这部分算进去) last /= 2; a[n - 1] -= last; a[n - 2] += last; }
int resupply(int *arr, int n) { int num = 0; int i; for (i = 0; i < n; i++) { if (arr[i] % 2 == 1) { arr[i]++; num++; } } return num; }
int equal(int *arr, int n) { int i; for (i = 1; i < n; i++) { if (arr[i] != arr[0]) return 0; } return 1; }
int main(void) { int i, n, *arr; int count = 0; scanf("%d", &n); arr = (int *)malloc(n * sizeof(int)); for (i = 0; i < n; i++) scanf("%d", arr + i); do { distribute(arr, n); count += resupply(arr, n); } while (!equal(arr, n)); free(arr); printf("%d\n", count); return 0; }
|