题目如下:
题目描述
有 n 个人在一个水龙头前排队接水,假如每个人接水的时间为 Ti,请编程找出这 n 个人排队的一种顺序,使得 n 个人的平均等待时间最小。
输入格式
第一行为一个整数 n。
第二行 n 个整数,第 i 个整数 Ti 表示第 i 个人的接水时间 Ti。
输出格式
输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
牛逼代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
struct People{
int num;
int tim;
}pe[1005];
bool cmp(People p1,People p2){
return p1.tim<p2.tim;
}
int main(){
int n;
cin>>n;
double sum=0;
for(int i=1;i<=n;i++){
cin>>pe[i].tim;
pe[i].num=i;
}
sort(pe+1,pe+n+1,cmp);
for(int i=1;i<=n;i++){
cout<<pe[i].num<<" ";
sum+=(n-i)*pe[i].tim;
}
cout<<endl;
printf("%.2lf",sum/n);
return 0;
}
思考时间:
找一种排序方法使得平均时间最小,没错,相信你的直觉,只有让接水时间最小的人先排,平均接水时间才会最小,具体的公式可以是这样:avg*n=(n-1)*t1+(n-2)*t2+...+1*tn.
注意:t1,t2,...,tn均为第 i (1<=i<=n)个人接水所用时间,其中(n-1)*t1,是在第一个人接水时有(n-1)个人要等着,以此类推...,不难得到,由于人数是不变的,要想使平均接水时间最小,必须是用时最少的人先接,用时最多的人后接.
既然有了数学的支持,那么就可以甩开膀子(开开心心)的去敲代码力!!!
代码时间:
用结构体是因为可以方便的将序号和时间绑定到一个人身上,而且排序很方便!!!
代码开头对数据的读入就不多说了,先来看到排序函数sort 通过接水时间tim的大小对序号排序,具体实现是cmp函数传入两个结构体变量,比较他们的tim成员,如果p1.tim大于p2.tim,将会返回false,交换两变量的num值,反之则不交换。这样就将每个人按接水时间的大小把序号排好了,接下来就是输出了。
其次,本题的第二个要求是输出最小平均等待时间,那么就是在对数据进行输出的时候顺便将sum变量算好(按上面的公式),最后不要忘记除n和保留两位小数。