目前共有2篇帖子。 字体大小:较小 - 100% (默认)▼  内容转换:港澳繁體▼
 
点击 回复
309 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)
 

本帖信息

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