1 条题解

  • 0
    @ 2025-4-18 11:39:22

    题意分析

    题目描述 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.
      • 每个测试用例后空一行。

    解题思路

    1. 计算目标高度
      • 所有砖块的平均高度即为目标高度 target = sum(heights) / n
    2. 计算最少移动次数
      • 对于每一堆砖块,如果其高度 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
    上传者