府扔影 发表于 2025-6-4 16:53:40

洛谷P1223 排队接水

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#includeusing namespace std;struct people {        int t;        int id;}a;//按接水时间来升序排列bool compare(people& a, people& b) {        return a.t < b.t;}int n;int main(){        cin >> n;        for (int i = 1; i > a.t;                a.id = i;        }        sort(a + 1, a + 1 + n, compare);        for (int i = 1; i

蚬蕞遂 发表于 2025-11-1 21:45:50

用心讨论,共获提升!

任佳湍 发表于 2025-11-18 10:55:33

谢谢分享,试用一下

袁勤 发表于 2025-12-22 05:10:35

谢谢分享,辛苦了

锄淫鲷 发表于 2025-12-26 03:41:54

感谢分享

院儿饯 发表于 2026-1-4 17:19:49

收藏一下   不知道什么时候能用到

凳舒 发表于 2026-1-17 13:18:09

感谢,下载保存了

缄戈 发表于 2026-1-18 09:15:17

分享、互助 让互联网精神温暖你我

利怡悦 发表于 2026-1-18 15:17:15

前排留名,哈哈哈

嫁吱裨 发表于 2026-1-20 01:14:35

谢谢分享,辛苦了

劳暄美 发表于 2026-1-22 11:35:35

新版吗?好像是停更了吧。

驼娑 发表于 2026-1-22 20:07:16

感谢分享,学习下。

狙兕 发表于 2026-1-22 21:13:17

不错,里面软件多更新就更好了

替攀浮 发表于 2026-1-23 07:13:24

用心讨论,共获提升!

仰翡邸 发表于 2026-1-23 10:18:47

不错,里面软件多更新就更好了

僻嘶 发表于 2026-1-24 04:52:02

懂技术并乐意极积无私分享的人越来越少。珍惜

史穹逊 发表于 2026-1-24 12:15:43

谢谢分享,辛苦了

晾棋砷 发表于 2026-1-29 05:08:34

收藏一下   不知道什么时候能用到

杓疠? 发表于 2026-2-2 22:05:07

不错,里面软件多更新就更好了

醋辛 发表于 2026-2-4 04:00:47

新版吗?好像是停更了吧。
页: [1] 2
查看完整版本: 洛谷P1223 排队接水