题目描述
有 n 个人在一个水龙头前排队接水,假如每个人接水的时间为 Ti,请编程找出这 n 个人排队的一种顺序,使得 n 个人的平均等待时间最小。
输入格式
第一行为一个整数 n。
第二行 n 个整数,第 i个整数 Ti,表示第 i 个人的等待时间 Ti。
输出格式
共两行:
第一行为一种平均时间最短的排队顺序;
第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
样例数据
输入样例 #1 | 输出样例 #1 |
---|---|
10 56 12 1 99 1000 234 33 55 99 812 | 3 2 7 8 1 4 9 6 10 5 291.90 |
样例分析
如上所述。
数据范围
100% 的数据:1≤n≤1000;ti≤10^6,
当 ti 重复时,按照输入顺序即可。
解题:
#include<bits/stdc++.h>
using namespace std;
int n,a[1005],b[1005];
double c;
bool f=true;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=i;
while(f){
f=false;
for(int i=1;i<n;i++){
if(a[i]>a[i+1]){
f=true;
swap(a[i],a[i+1]);
swap(b[i],b[i+1]);
}
}
}
for(int i=1;i<=n;i++)printf("%d ",b[i]);
for(int i=1;i<=n;i++)c+=a[i]*(n-i);
c/=n;
cout<<endl<<fixed<<setprecision(2)<<c;
return 0;
}