复制
收藏
提问
简洁
写一个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 。
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
你觉得结果怎么样?