1 条题解

  • 0
    @ 2026-2-1 16:54:41
    #include <iostream>   // C++基础输入输出头文件(cin/cout)
    #include <algorithm>  // 包含sort排序函数,直接调用即可
    using namespace std;  // 省去std::前缀,方便学生使用
    
    int main() {
        // 定义变量:n=打水人数,r=水龙头数量;total总等待时间用long long避免数值溢出
        int n, r;
        long long total = 0;
        // 题目数据范围n≤500、r≤100,开固定大小数组完全满足需求
        int t_arr[500];   // 存储每个人的打水时间
        int tap_end[100]; // 存储每个水龙头的「当前结束时间」
    
        // 输入打水人数和水龙头数量
        cin >> n >> r;
        // 输入n个人的打水时间,存入数组
        for (int i = 0; i < n; i++) {
            cin >> t_arr[i];
        }
    
        // 直接调用sort排序:对打水时间升序排列(短时间在前,贪心核心)
        // sort(数组起始地址, 数组结束地址),默认升序
        sort(t_arr, t_arr + n);
    
        // 初始化水龙头结束时间数组为0(所有水龙头初始都是空闲状态)
        for (int i = 0; i < r; i++) {
            tap_end[i] = 0;
        }
    
        // 逐个安排每个人打水(贪心核心:每次选最空闲的水龙头)
        for (int i = 0; i < n; i++) {
            int cur_t = t_arr[i]; // 当前要安排的人的打水时间
            // 找到「结束时间最早」的水龙头,记录其下标
            int min_idx = 0; // 初始假设第0个水龙头最空闲
            for (int j = 1; j < r; j++) {
                if (tap_end[j] < tap_end[min_idx]) {
                    min_idx = j; // 发现更空闲的水龙头,更新下标
                }
            }
    
            // 累加总等待时间:当前人的耗时 = 水龙头排队时间 + 自己打水时间
            total += tap_end[min_idx] + cur_t;
            // 更新该水龙头的结束时间(加上当前人的打水时间)
            tap_end[min_idx] += cur_t;
        }
    
        // 输出最终总等待时间
        cout << total << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    1039
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    4
    已通过
    1
    上传者