首页 > 其他 > 详细

排队打水

时间:2020-01-02 17:03:41      阅读:88      评论:0      收藏:0      [点我收藏+]
有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。N<=5000

Input

共两行,第一行为n;第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。

Output

平均等待时间(输出结果精确到小数点后两位)。

Sample Input

10
56 12 1 99 1000 234 33 55 99 812

Sample Output

291.90


sol:我们先假设只有2个人a,b排队打水,不妨设接水的时间timea<timeb,如果a在b前面打水,则总时间为timea+(timea+timeb),
如果b在a前面,则总时间为timeb+(timeb+timea),因为timea<timeb,所以a在b前面更优。
当然你也可以设有多个人,发现交换a,b的顺序对a,b前后的人用时是没有影响的。
所以我们只需要按照每个人打水时间从小到大进行排序,先后打水就可以了。本题贪心策略明显。
 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,a[1010];
 6 int main() 
 7 {
 8     scanf("%d",&n);
 9     for(int i=1; i<=n; i++)
10         scanf("%d",&a[i]);
11     sort(a+1,a+n+1);
12     double sum=0;
13     for(int i=1; i<=n; i++)     
14     {
15         sum+=(n-i)*a[i];
16     }
17  
18     printf("%.2lf",sum/n);
19     return 0;
20 }

 



排队打水

原文:https://www.cnblogs.com/cutepota/p/12133458.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!