复制
收藏
提问
简洁

写一个C语言代码 题目描述 有 N 堆纸牌,编号分别为 1,2,…,N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N∗−1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如 N=4,4 堆纸牌数分别为: ①9②8③17④6 移动 3 次可达到目的: 从 ③ 取 4 张牌放到 ④ (9,8,13,10)-> 从 ③ 取 3 张牌放到 ②(9,11,10,10)-> 从 ② 取 1 张牌放到①(10,10,10,10)。 输入格式 第一行为:N(N 堆纸牌,1≤N≤100)。 第二行为:A 1 ​ ,A 2 ​ ,…,A n ​ (N堆纸牌,每堆纸牌初始数,1≤A i ​ ≤10000)。 输出格式 一行:即所有堆均达到相等时的最少移动次数。 输入输出样例 输入 4 9 8 17 6 输出 3 第一行输入 4 表示共有 4 堆纸牌,随后一行给出每一堆纸牌的初始数量,先计算前缀和,得出 9 17 34 40,在求平均数为 10。当且仅当此时牌堆1-i 总牌数 != i\*总平均数张(牌堆 1-i 在之前的交换中纸牌总数保持不变),需要移动一次,即第一次总牌数为 10,第二次为 20,第三次为 30,第四次为 40,相等退出,所以最后移动结果为 3 。

e6c1df3c6
2个月前
全网
文档
学术
百科
知识库
时间不限
自动
回答简洁模式
深入研究一些

C语言代码实现

#include <stdio.h>

int main() {
    int N, i, moves = 0, avg, total = 0;
    scanf("%d", &N);
    int piles[N];
    for (i = 0; i < N; i++) {
        scanf("%d", &piles[i]);
        total += piles[i];
    }
    avg = total / N;

    for (i = 0; i < N; i++) {
        if (piles[i] < avg) {
            int j = i + 1;
            while (piles[i] < avg && j < N) {
                int diff = avg - piles[i];
                if (piles[j] >= diff) {
                    piles[j] -= diff;
                    piles[i] += diff;
                    moves++;
                } else {
                    piles[i] += piles[j];
                    piles[j] = 0;
                    moves += (avg - piles[i]) / piles[j] + 1;
                    piles[i] = avg;
                }
                j++;
            }
        } else if (piles[i] > avg) {
            int diff = piles[i] - avg;
            piles[i] -= diff;
            if (i == N - 1) {
                while (diff > 0) {
                    piles[i - 1] += avg;
                    diff -= avg;
                    moves++;
                }
            } else {
                piles[i + 1] += diff;
                moves++;
            }
        }
    }

    printf("%d\n", moves);
    return 0;
}

这段C语言代码实现了题目要求的功能。首先,它读取纸牌堆数N和每堆的初始数量,然后计算总牌数和平均数。接着,通过循环遍历每堆纸牌,根据题目描述的移动规则,计算出使每堆纸牌数都一样多所需的最少移动次数,并输出这个次数。710

你觉得结果怎么样?
C语言实现纸牌移动算法
如何用C语言解决纸牌分配问题
C语言纸牌移动最少次数算法
纸牌分配问题的C语言实现
C语言解决纸牌问题的方法
C语言实现纸牌平均分配算法

以上内容由AI搜集生成,仅供参考

在线客服