#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; }
|