1 条题解

  • 0
    @ 2025-7-14 14:53:45
    #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
    上传者