1 条题解
-
0
#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
- 上传者