洛谷P1223 排队接水

news/2025/3/16 11:18:47/文章来源:https://www.cnblogs.com/Tomorrowland/p/18343729

P1223 排队接水

题目描述

\(n\) 个人在一个水龙头前排队接水,假如每个人接水的时间为 \(T_i\),请编程找出这 \(n\) 个人排队的一种顺序,使得 \(n\) 个人的平均等待时间最小。

输入格式

第一行为一个整数 \(n\)

第二行 \(n\) 个整数,第 \(i\) 个整数 \(T_i\) 表示第 \(i\) 个人的接水时间 \(T_i\)

输出格式

输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。

样例 #1

样例输入 #1

10 
56 12 1 99 1000 234 33 55 99 812

样例输出 #1

3 2 7 8 1 4 9 6 10 5
291.90

提示

\(1\le n \leq 1000\)\(1\le t_i \leq 10^6\),不保证 \(t_i\) 不重复。

思路:

  • 我们可以采取贪心的策略,将接水时间慢的人放在后面排队,那么后面的人的排队时间就较短,这是我们的直觉告诉我们的结果,并且,这也是贪心策略的局部最优解,我们只需要尽可能的将接水时间长的人排在后面接水,那么其他人等待的时间就会减少,到最终时,总的接水时间就会最少。
  • 那么我们这种的接水策略是否能严格的数学证明呢?其实大部分的时候,我们贪心策略的思想,就是非常正常的常识,只要我们举不出明显的反例来证明我们的策略不可行,我们就可以使用贪心策略,不过这题我们还真的可以来进行严格的数学证明我们这个策略的可行性。

证明策略的可行性

  • 从这里也可以看出,贪心策略往往与排序是一起出现的,每次枚举最优的解法,最终达到最优的结果!

代码:

#include<algorithm>
#include<iostream>
using namespace std;
struct people {int t;int id;
}a[1005];
//按接水时间来升序排列
bool compare(people& a, people& b) {return a.t < b.t;
}
int n;
int main()
{cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i].t;a[i].id = i;}sort(a + 1, a + 1 + n, compare);for (int i = 1; i <= n; i++) {cout << a[i].id << " ";}cout << endl;double sum = 0;//这里为什么要✖(n-i)呢,因为第一个人洗澡的时候,后面n-1个人都要等它,第二个人,后面的n-2个人又要等他for (int i = 1; i <= n - 1; i++) sum += a[i].t*(n-i);double average = sum / n;printf("%.2lf", average);return 0;
}

部分代码的解释:

计算sum的部分涉及到如下的代码段:

double sum = 0;
for (int i = 1; i <= n - 1; i++)sum += a[i].t * (n - i);

这段代码的目的是计算加权平均数的值,其具体含义是在对人员按照t属性排序后,计算每个人在队列中的等待时间乘以其后面人数的总和。让我们分析一下为什么要乘以(n - i)

  1. 排序的影响

    • 数组 a[] 中的人员按照 t 属性从小到大排序。
    • 排序后,a[i].t 表示第 i 个人的处理时间。
  2. 等待时间的计算

    • 在排序后的顺序中,如果第 i 个人在队列中,那么他前面有 i - 1 个人,因此他的等待时间就是前面所有人的处理时间之和。
  3. 加权求和的原理

    • 对于第 i 个人,他的等待时间为 a[i].t * (n - i)。这里 (n - i) 表示的是他后面的人数,因为他后面的每个人都要等待他的处理时间。
  4. 计算总和

    • sum += a[i].t * (n - i) 就是把每个人的等待时间乘以后面的人数加起来,得到总的加权等待时间之和。
  5. 最终的平均值

    • average = sum / n 就是将这个加权等待时间之和除以总人数 n,得到的是每个人的平均等待时间。

因此,乘以 (n - i) 的操作是为了正确地计算每个人的等待时间对整体加权平均数的贡献,确保了按照题目要求正确计算平均值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/778233.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nessus Professional 10.8.0 Auto Installer for Ubuntu 24.04

Nessus Professional 10.8.0 Auto Installer for Ubuntu 24.04Nessus Professional 10.8.0 Auto Installer for Ubuntu 24.04 发布 Nessus 试用版自动化安装程序,支持 macOS Sonoma、RHEL 9 和 Ubuntu 24.04 请访问原文链接:https://sysin.org/blog/nessus-auto-install-for-…

Fortinet FortiGate Firmware (FortiOS 7.6.0) 全系列下载 - 下一代防火墙 (NGFW)

Fortinet FortiGate Firmware (FortiOS 7.6.0) 全系列下载 - 下一代防火墙 (NGFW)Fortinet FortiGate Firmware (FortiOS 7.6.0) 全系列下载 - 下一代防火墙 (NGFW) 防特网 飞塔 防火墙 系统软件 请访问原文链接:https://sysin.org/blog/fortinet-fortigate/,查看最新版。原创…

哲讯智能:苏州SAP代理,引领企业智能化转型

苏州,这座融合古典与现代的城市,以其独特的魅力和创新精神,成为企业发展的热土。在数字化转型的大潮中,哲讯智能科技有限公司作为苏州地区值得信赖的SAP代理,致力于为企业提供全面的SAP解决方案,助力企业实现智能化管理和业务流程的优化。SAP系统的重要性SAP系统作为全球…

【闲话】08.05.24

又笑又哭的是什么毛病0805 闲话 头图:今日推歌: 《1212。》 エイハブ/A4。おおお のべつ幕無しのこの世 噢噢噢 如此无止境的人世间 本能の赴くままに 在本能的驱使下随之逐流 生きる意義は推して知るべし 最后在其中知晓活着的意义 そりゃ幸じゃんか 这是多么幸运啊好久没听…

《数据结构习题解析与实验指导_李冬梅,张琪编著》总结出的大纲

下面大纲为《数据结构习题解析与实验指导_李冬梅,张琪编著》总结出的大纲,可装13学习下: OnionYang@

【PythonGIS】Arcpy中常用出图函数详解

出图是每个GISer都要经历的事,但有时候会有许多重复且多且无聊的出图任务,这个时候我们肯定想能不能自动化出图。ArcGIS中的模型创建就可以实现,但是我的数据大部分是在Python中处理的,所以就想能不能使用Python进行批量出图,正好今天跟大家分享一下。这里使用的mxd作为模…

SpringBoot-事件监听机制

SpringBoot-事件监听机制本文参考的SpringBoot版本是2.6.13一、Spring Boot 启动事件顺序事件执行顺序:  1. ApplicationStartingEvent         spring boot最开始启动时触发,SpringApplication.run() 之前发送。2. ApplicationEnvironmentPreparedEvent   …

免费为您的网页创建在线客服,扣子(COZE) WEB SDK图文使用教程

🧙‍♂️ 大家好,我是斜杠君,手把手教你搭建扣子AI应用。 📜 我的教程《AI应用开发系列教程之扣子(Coze)实战教程》上线了,完全免费学习。最近,扣子(COZE) 的 Web SDK 正式上线了。有同学问"Web SDK"如何使用?今天,斜杠君就带大家学习COZE 「Web SDK」的使…

Mysql的length函数,char_length函数与字符,字节的区别

在存储中,1个英文单词或1个英文字符为1个1字节,1个中文或1个中文字符为3个字节在Mysql5.0之前,VARCHAR(20)中的20表示20个字节,英文可以存储20个,但中文只能存储6个在Mysql5.0之后,varchar(20)中的20表示20个字符,不管中文还是英文都可以存储20个length()函数是查找字节…

技术的八荣八耻

1. 以接口兼容为荣,以接口裸奔为耻以接口兼容为荣,怎么理解呢?很多bug都是因为修改了对外旧接口,但是却不做兼容导致的。关键这个问题多数是比较严重的,可能直接导致系统发版失败的。新手程序员很容易犯这个错误。所以我们修改老接口的时候,一般要做好兼容。如果你的需求…

解决windows报错:该文件没有与之关联的应用来执行该操作

报错截图:解决方案 1、新建txt文件2、复制内容到txt文件 taskkill /f /im explorer.exe reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "C:\Windows\system32\imageres.dll,154" /t reg_sz /f …

tomcat10 springboot项目部署成功但springboot没有启动日志问题

问题描述项目在tomcat8可以启动成功,请求也可以正常处理,在tomcat10上只有部署成功信息比如: deployWAR Deployment of web application archive [/data1/WWW/webapps/XXX.war] has finished in [127] ms, 但是没有springboot启动的信息。 该问题 不属于springboot打包为war包…