| Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|
| 81416 | sh25_chenyj | [贪心算法]排队接水 | C++ | 通过 | 0 MS | 248 KB | 1759 | 2026-01-04 19:02:35 |
#include <iostream> #include <iomanip> // 用于控制输出格式(setprecision, fixed) #include <algorithm> // 用于排序(sort) using namespace std; // 定义一个结构体来存储人的信息:原始编号和接水时间 struct Person { int id; // 原始编号(从1开始) int time; // 接水时间 }; // 自定义比较函数:按接水时间从小到大排序,时间相同时按编号从小到大排 bool cmp(const Person &a, const Person &b) { if (a.time == b.time) { return a.id < b.id; // 时间相同,编号小的优先(稳定输出) } return a.time < b.time; } int main() { int n; cin >> n; Person people[1005]; // 题目未明确给出n的最大值,这里假设一个足够大的值 for (int i = 0; i < n; i++) { cin >> people[i].time; people[i].id = i + 1; // 编号从1开始 } // 使用贪心策略排序:接水时间短的人在前 sort(people, people + n, cmp); // 1. 输出排队顺序(即排序后的编号序列) for (int i = 0; i < n; i++) { cout << people[i].id; if (i != n - 1) { cout << " "; // 最后一个编号后不输出空格 } } cout << endl; // 2. 计算并输出平均等待时间 long long totalWaitTime = 0; // 使用长整型防止总和过大 for (int i = 0; i < n; i++) { // 第i个人的接水时间会使后面 (n-i-1) 个人等待 totalWaitTime += (long long)people[i].time * (n - i - 1); } double averageWaitTime = (double)totalWaitTime / n; // 保留两位小数输出 cout << fixed << setprecision(2) << averageWaitTime << endl; return 0; }