1 条题解
-
0
#include<iostream> #include<cstdio> using namespace std; int main() { int a[100]; // 定义数组存储每堆纸牌数量 int n, i, av, j, s = 0; // n-纸牌堆数, i/j-循环变量, av-平均值, s-移动次数 cin >> n; // 输入每堆纸牌数量并计算总和 for (i = 1; i <= n; i++) { cin >> a[i]; s = s + a[i]; } av = s / n; // 计算每堆应达到的平均值 s = 0; // 重置s用于计数移动次数 // 计算每堆与平均值的差值(正数表示多余,负数表示不足) for (i = 1; i <= n; i++) a[i] = a[i] - av; // 跳过首尾不需要移动的堆(差值为0) i = 1; j = n; while (a[i] == 0) i++; // 找到左边第一个需要调整的堆 while (a[j] == 0) j--; // 找到右边第一个需要调整的堆 // 核心调整逻辑 while (i < j) { a[i + 1] = a[i + 1] + a[i]; // 将当前堆的差值传递给下一堆 a[i] = 0; // 当前堆调整完成 s++; // 移动次数+1 i++; // 处理下一堆 while (a[i] == 0) i++; // 跳过已平衡的堆 } cout << s; // 输出最少移动次数 }
- 1
信息
- ID
- 861
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 8
- 标签
- 递交数
- 23
- 已通过
- 5
- 上传者