1 条题解
-
0
题意分析
题目描述 Bob 有一堆砖块,他将其叠成若干堆,每堆高度可能不同。现在他希望调整所有堆的高度相同,并且移动的砖块数最少。已知砖块总数可以整除堆数,因此一定能调整到相同高度。
输入要求:
- 多个测试用例,每个用例包含:
- 堆数
n
(1 ≤ n ≤ 50)。 - 每堆的高度
h_i
(1 ≤ h_i ≤ 100)。
- 堆数
- 输入以
n = 0
结束。
输出要求:
- 对于每个测试用例,输出:
- 测试用例编号(
Set #1
,Set #2
, ...)。 - 最少需要移动的砖块数
k
,格式为The minimum number of moves is k.
。 - 每个测试用例后空一行。
- 测试用例编号(
解题思路
- 计算目标高度
- 所有砖块的平均高度即为目标高度
target = sum(heights) / n
。
- 所有砖块的平均高度即为目标高度
- 计算最少移动次数
- 对于每一堆砖块,如果其高度
h_i > target
,则需要移走h_i - target
块砖。 - 累加所有需要移走的砖块数,即为答案
moves
。
- 对于每一堆砖块,如果其高度
关键点:
- 由于题目保证砖块总数可被
n
整除,因此无需处理无法均分的情况。 - 只需要计算高于平均高度的砖块数,因为低于平均高度的砖块会被其他堆的砖块补充。
正确代码(C++)
#include <iostream> #include <vector> using namespace std; void solve_case(int case_num, const vector<int>& heights) { int total = 0; for (int h : heights) { total += h; } int avg = total / heights.size(); int moves = 0; for (int h : heights) { if (h > avg) { moves += h - avg; } } cout << "Set #" << case_num << endl; cout << "The minimum number of moves is " << moves << "." << endl; cout << endl; } int main() { int n, case_num = 1; while (cin >> n, n != 0) { vector<int> heights(n); for (int i = 0; i < n; ++i) { cin >> heights[i]; } solve_case(case_num, heights); case_num++; } return 0; }
- 多个测试用例,每个用例包含:
- 1
信息
- ID
- 478
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者