設置 | 登錄 | 註冊

目前共有2篇帖子。

【试题】分糖果

1樓 巨大八爪鱼 2016-3-14 21:23
#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;
}
2樓 巨大八爪鱼 2016-3-14 21:32
结果:正确

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。