作者共发了2篇帖子。 内容转换:不转换▼
 
点击 回复
209 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)
 

本帖信息

点击数:209 回复数:1
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2016-3-14 21:32
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。