2 条题解

  • 0
    @ 2026-3-15 14:40:46
    #include <iostream>
    using namespace std;
    int main() {
        // n: 接水人数, m: 水龙头个数
        int n, m;
        cin >> n >> m;
          // 创建数组存储每个人的接水量
        int w[10005];  // 因为n最大10000,多开一点空间
         // 读入每个人的接水量
        for (int i = 1; i <= n; i++) {
            cin >> w[i];
        }
        // 创建数组存储每个水龙头的剩余接水时间
        // 一开始,前m个人分别占用m个水龙头
        int taps[105] = {0};  // 水龙头剩余时间,m最大100
        // 初始化:前m个人开始接水
        for (int i = 1; i <= m; i++) {
            taps[i] = w[i];
        }
        // 记录当前要安排的第几个人(从第m+1个人开始)
        int nextPerson = m + 1;
        
        // 记录总时间
        int time = 0;
        // 当还有人没接完水时,继续循环
        while (nextPerson <= n) {
            // 找出当前剩余时间最少的水龙头
            int minTime = 1000000;  // 先设一个很大的数
            int minIndex = 1;
            
            for (int i = 1; i <= m; i++) {
                if (taps[i] < minTime) {
                    minTime = taps[i];
                    minIndex = i;
                }
            }
            
            // 时间流逝minTime秒
            time = time + minTime;
            // 所有水龙头的剩余时间减去minTime
            for (int i = 1; i <= m; i++) {
                taps[i] = taps[i] - minTime;
            }
            
            // 把下一个接水的人安排到空出来的水龙头
            taps[minIndex] = w[nextPerson];
            nextPerson++;
        }
        
        // 最后,找出所有水龙头中剩余时间最长的
        int maxTime = 0;
        for (int i = 1; i <= m; i++) {
            if (taps[i] > maxTime) {
                maxTime = taps[i];
            }
        }
        // 总时间 = 已经过的时间 + 最后一批人接完需要的时间
        time = time + maxTime;
        // 输出结果
        cout << time << endl;
        return 0;
    }
    
    

    信息

    ID
    581
    时间
    1000ms
    内存
    128MiB
    难度
    8
    标签
    递交数
    13
    已通过
    6
    上传者