【题目描述】
有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。
【输入】
共两行,第一行为n(1≤n≤1000);第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。
【输出】
有两行,第一行为一种排队顺序,即1到n的一种排列;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
实现思维:
因为T2(这里懒,直接以T2表示第2个人的等候时间,后面文字表述也是这样)=T1,T3=T2+T1,T4=T3+T2+T1…Tn=Tn-1+Tn-2+…+T1。
这样等候时间=Tn+2*T(n-1)+…n*T2
所以令排在前面的人速度尽可能快,我会考虑到排序(正常人谁不用排序啊)
那么第二个问题是,如何输出一个两位小数
这里,我使用“cout<<fixed<<setprecision(小数位数)<<n;”来解决
于是,就完工了。
贴代码:
#include<iostream>
#include<iomanip>
#include<cstdio>
using namespace std;
int main(){
int i,n,a[1005],b[1005],f;
double s=0;
cin>>n;
for(i=0;i<n;i++){
cin>>a[i];
b[i]=i+1;
}
for(i=0;i<n;i++){
for(int j=n-1;j>0;j--){
if(a[j]<a[j-1]){
swap(a[j],a[j-1]);
swap(b[j],b[j-1]);
}
}
}//快速排序
for(i=0;i<n;i++){
cout<<b[i]<<' ';
}
cout<<endl;
for(i=0;i<n;i++){
a[i]*=(n-i-1);
s+=a[i];
}
s/=n;
cout<<fixed<<setprecision(2)<<s;//题目要求:(输出结果精确到小数点后两位) ,所以用fixed+setprecision解决
return 0;
}
记得三连~~