設置 | 登錄 | 註冊

目前共有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許可協議進行許可。