洛谷 P1223 排队接水

洛谷 P1223 排队接水

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#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

说明

n<=1000

ti<=1e6,不保证ti不重复

思路:

贪心算法,排队接水时从时间小的往后排,等待时间最少,记录下所有人的等待时间的和(注意,第一个人等待时间为0,第二个人的等待时间为第一个人接水的时间,以此类推),求平均值,用结构体输出它的编号。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 int s[1001],tot,n;
 7 double ans,m;
 8 struct Pd{
 9     int a,b;
10 }d[1001];
11 
12 int cmp(const Pd &p,const Pd &q){
13      if(p.b<q.b) return 1;
14      else return 0;
15 }
16 
17 int main()
18 {
19     cin>>m;
20     n=(int)m;
21     for(int i=1;i<=n;i++){
22         /*d[i].a=d[i-1].a+1;*/
23         d[i].a=i;
24         cin>>d[i].b;
25     }sort(d+1,d+n+1,cmp);
26     for(int i=2;i<=n;i++){
27         tot+=d[i-1].b;
28         s[i]+=tot;
29         ans+=s[i];
30     }
31     /*for(int i=1;i<=n;i++){
32         for(int j=1;j<i;j++){
33             ans+=d[j].b;
34         }
35     }*/
36     for(int i=1;i<=n;i++){
37         cout<<d[i].a<<" ";
38     }cout<<endl;
39     double w=ans/m;
40     printf("%.2lf",w);
41     return 0;
42 }
 
posted @ 2017-04-22 17:38  橘生淮南终洛枳  阅读(1713)  评论(0编辑  收藏  举报