【贪心】排队接水(大水)

 

题目描述

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

输入

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

输出

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

样例输入

10
56 12 1 99 1000 234 33 55 99 812

样例输出

3 2 7 8 1 4 9 6 10 5
291.90

 1 #include <bits/stdc++.h>
 2 struct ss
 3 {
 4     int t,num;
 5 } a[1000];
 6 int n;
 7 double tot;
 8 int cmp(const void*a,const void*b)
 9 {
10     ss c=*(ss*)a,d=*(ss*)b;
11     if (c.t<d.t) return -1;
12     if (c.t>d.t) return 1;
13     if (c.num<d.num) return -1;
14     if (c.num>d.num) return 1;
15     return 0;
16 }
17 int main()
18 {
19     scanf("%d",&n);
20     for (int i=1; i<=n; ++i)
21     {
22         scanf("%d",&a[i].t);
23         a[i].num=i;
24     }
25     qsort(a,n+1,sizeof(ss),cmp);
26     for (int i=1; i<=n; ++i)
27         tot+=a[i].t*(n-i);
28     tot/=n;
29     for (int i=1; i<n; ++i) printf("%d ",a[i].num);
30     printf("%d\n%.2f\n",a[n].num,tot);
31     return 0;
32 }
 

猜你喜欢

转载自www.cnblogs.com/Diliiiii/p/9153416.html