目前共有2篇帖子。 內容轉換:不轉換▼
 
點擊 回復
212 1
【试题】分糖果
一派護法 十九級
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
结果:正确

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:212 回複數:1
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2016-3-14 21:32
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。