洛谷 P1223 排队接水:贪心策略与代码逐行详解

发布时间:2026/10/11 10:37:59

洛谷 P1223 排队接水:贪心策略与代码逐行详解 1. 题目回顾排队接水是洛谷上一道经典的贪心入门题P1223。题目大意是有n个人在一个水龙头前排队接水第i个人接水需要w[i]秒。每个人接水时后面的人都要等待。问如何安排接水顺序使得所有人接水时间的总和等待时间 接水时间最小并输出这个顺序和平均等待时间。2. 贪心思想为什么短任务优先先想一个生活场景银行柜台只有一个窗口前面排着两个人一个办业务要 10 分钟另一个只要 1 分钟。如果让 10 分钟的人先办那么 1 分钟的人要干等 10 分钟反过来1 分钟的人先办10 分钟的人只多等 1 分钟。显然让耗时短的人先办总等待时间更小。数学上可以证明任意交换两个相邻且前者耗时更长的人总等待时间都会下降所以最优解一定是按耗时从小到大排列。这就是贪心策略——每一步都让当前最短的任务先执行。3. 数据结构与排序structwater{intidx;// 人的编号从 1 开始intv;// 接水耗时}w[10005];这里用一个结构体把「编号」和「耗时」绑在一起因为排序后我们还要输出原来的编号顺序不能只排耗时而丢掉编号。boolcmp(water a,water b){if(a.v!b.v){returna.vb.v;// 耗时不同耗时小的排前面}returna.idxb.idx;// 耗时相同编号小的排前面保证稳定性}cmp是传给sort的比较函数第一关键字是耗时v第二关键字是编号idx。当两个人耗时一样时按编号升序这样输出结果确定、不会因排序不稳定而变。sort(w1,wn1,cmp);注意这里数组下标从1开始存所以排序范围是w[1]到w[n]对应w1到wn1左闭右开。4. 核心等待时间累加doublesum0;// 当前已经累计的等待时间doubleans0;// 总等待时间for(inti1;in;i){anssum;// 第 i 个人接水前他等待了 sum 秒sumw[i].v;// 他接完水后后面的人要多等 w[i].v 秒}这是全题最精妙的两行。我们模拟一下第 1 个人接水前等待0秒ans 0然后sum w[1].v第 2 个人接水前等待w[1].v秒ans w[1].v然后sum w[1].v w[2].v第 3 个人接水前等待w[1].v w[2].v秒ans ...依此类推。所以ans累加的是每个人接水前已经等待的总时长也就是题目要求的「等待时间总和」。5. 输出与平均等待时间for(inti1;in;i){coutw[i].idx ;// 按最优顺序输出每个人的原编号}coutendl;ansans/n;// 平均等待时间printf(%.2f,ans);// 保留两位小数输出先按排序后的顺序输出每个人的编号用空格隔开再计算平均等待时间ans / n最后用printf(%.2f)保留两位小数。6. 完整代码带注释#includebits/stdc.husingnamespacestd;structwater{intidx;// 编号intv;// 接水耗时}w[10005];boolcmp(water a,water b){if(a.v!b.v)returna.vb.v;// 耗时短优先returna.idxb.idx;// 耗时相同按编号}intmain(){intn;cinn;for(inti1;in;i){cinw[i].v;w[i].idxi;}sort(w1,wn1,cmp);// 按耗时升序排序doublesum0,ans0;for(inti1;in;i){coutw[i].idx ;// 输出最优顺序}coutendl;for(inti1;in;i){anssum;// 第 i 人等待时间sumw[i].v;// 更新后续等待}ansans/n;printf(%.2f,ans);// 平均等待时间保留两位小数return0;}7. 易错点提醒编号从 1 开始题目要求输出的是原编号不是排序后的位置所以结构体里必须存idx。排序范围数组从下标 1 开始存sort的区间是w1到wn1写错会漏排或越界。累加顺序一定是「先ans sum再sum w[i].v」顺序反了结果就错了。数据类型等待时间总和可能较大用double或long long累加避免溢出输出用printf(%.2f)保证两位小数。8. 小结这道题的核心就一句话让接水时间短的人先接水。排序 前缀等待累加即可在O(n log n)时间内求出最优顺序和平均等待时间。理解了这个贪心模型后面很多「任务调度」「排队优化」类题目都能触类旁通。
延伸阅读

更多相关文章

2026/10/11 10:37:59

DMD实战指南:从流场快照到动态模态分解的完整实现

简介:这份资源是面向动力系统数据分析学习者与科研人员的MATLAB版动态模式分解(DMD)实现包,适合具备一定线性代数与MATLAB基础、希望将高维时间序列降维并提取低维动态模式的中高级用户。包内共3个文件,包含1个m脚本、…

2026/10/11 10:32:59

旧款手表数据同步:中文绿色版ZIP工具的完整使用指南

简介:松拓Moveslink2中文绿色版是一款针对松拓Ambit系列运动手表开发的免安装同步工具,主要帮助用户在电脑端完成运动数据上传、设备设置更新以及Movescount账户授权等操作,适合需要频繁在不同电脑间管理手表的运动爱好者或入门用户。压缩包共…

2026/10/11 10:32:59

PLC工程师12年经验:给自动化应届生的90条入行生存指南

1. 这个项目到底在做什么我打开这个标题看了三遍,脑子里蹦出来的第一个念头是:这玩意儿太真实了。“工作12年的PLC工程师,给自动化应届生的90条入行经验(每天更新)”,这句话没有炫技,没有标题党…

2026/10/11 11:33:02

AMD芯片组驱动安装报错1603/1308/GPIO2 Fail排查指南

AMD Chipset Software 8.08.12.551 这套驱动,最近把不少人都折腾得不轻。安装向导跑一半突然弹 1603,关掉弹窗再去看日志又出现 1308,继续追查还会发现 GPIO2 Fail 挂在列表里,三个错误码像接力一样轮流出现,让很多老玩…

2026/10/11 11:33:02

井盖破损检测实战:VOC数据集转YOLO训练与避坑指南

简介:本资源为城市道路井盖破损与丢失场景的目标检测数据集,面向从事智慧城市、道路巡检、市政设施安全监测方向的算法工程师与深度学习研究者,可用于训练和验证井盖异常状态识别模型。数据集采用Pascal VOC格式,仅包含jpg图片与对…

2026/10/11 11:33:02

搭建内网流媒体:第一期不值得做的五个功能

刚开始做内网流媒体那会儿,我跟大多数人一样,一上来就先开功能清单:要不要搞转码?要不要上海报墙?要不要给家里人分开账号?要不要做跨设备续播?这些功能听起来都很有道理,但内网流媒…

2026/10/11 11:33:02

DQN柔性作业车间调度:插单动态调度实战与训练避坑指南

简介:面向高校人工智能、自动化、电子信息等专业学生及柔性作业车间调度方向研究者,这份资源围绕DQN在带插单动态调度中的建模与求解展开,兼顾设备选择、工序排序与临时订单插入等典型难点,可直接用于毕业设计、课程设计与项目演示…

2026/10/11 11:33:02

impeccable:打造从commit到CI的代码质量硬门槛

如果你经历过“代码在我本地是好的啊”“这个文件为什么被改了”“这段缩进怎么两套风格”这些对话,大概率能理解我为什么要折腾一个叫 impeccable 的项目。这个词本意是“无可挑剔的”,而我们搞的这套东西,目标就是把“无可挑剔”从一句口号…

2026/10/11 11:28:02

TTP223电容触摸传感器实战指南:从原理到项目避坑

把TTP223电容触摸传感器从头到尾聊透,这件事我想写很久了。这枚小芯片在DIY圈子里几乎无处不在,触摸台灯、智能开关面板、门禁按键、互动装置,十有八九都是它在背后干活。三根线、一个焊盘、几行代码就能把普通开关换成无机械结构的触摸控制&…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑