
P1223 排队接水 题解复盘基本信息项目内容题目编号、来源P1223 洛谷 / 排队接水训练层级A 模板题知识版块贪心、排序、平均等待时间、结构体排序解题前 · 关键信号识别维度分析目标、约束、底层结构目标重新安排 n 个人的接水顺序使所有人的平均等待时间最小并输出排队顺序。约束同一时间只能一个人接水每个人需要完整接水。底层结构通过调整任务执行顺序减少整体等待时间本质是排序贪心问题。数据规模n ≤ 1000排序复杂度 O(nlogn) 可以满足要求。候选算法和依据算法贪心 排序。依据接水时间短的人先接可以减少后面所有人的等待时间因此按照接水时间从小到大排序。复杂度预判时间复杂度 O(nlogn)空间复杂度 O(n)。解题后 · 外化复盘维度内容实现结构 / 核心思路使用结构体保存编号id和接水时间t。按照接水时间升序排序时间相同时编号小的优先。输出排序后的编号。计算等待时间时用sum保存前面所有人的接水时间anssum表示当前人的等待时间sumv[i].t更新累计时间。错因回溯1. 只保存接水时间没有保存编号导致无法输出原编号。2. 不理解anssum; sumt的计算过程容易把自己的接水时间算入等待时间。3. 平均值计算时使用整数除法需要转换为double。4. 小数输出需要fixedsetprecision(2)。边界和易错点1. 第一个人的等待时间为 0。2. 时间相同按照编号升序排序。3. 总等待时间使用long long。4. 平均值使用double。下次看到什么信号我应该想到这个方法看到“排队、等待时间最小、平均完成时间最小、调整任务顺序”想到排序贪心按处理时间从小到大排序。AC 完整代码#includeiostream#includevector#includealgorithm#includeiomanipusingnamespacestd;structnode{intid;intt;};boolcmp(node a,node b){if(a.t!b.t)returna.tb.t;returna.idb.id;}intmain(){intn;cinn;vectornodev(n);for(inti0;in;i){cinv[i].t;v[i].idi1;}sort(v.begin(),v.end(),cmp);for(inti0;in;i)coutv[i].id ;coutendl;longlongans0,sum0;for(inti0;in;i){anssum;sumv[i].t;}coutfixedsetprecision(2)(double)ans/n;return0;}