Problem Description
有n(1<=n<=1000)个人在一个水龙头前排队接水,假如每个人接水的时间为ti,请找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。
Input
输入有多组数据,每组数据的第一行为n,第二行分别表示第1个人到第n个人的接水时间t1,t2,...,tn,每个数据之间有1个空格。
Output
对于每组数据输出两行,第一行为一种排队顺序,即1到n的一种排列,第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
Sample Input
10 56 12 1 99 1000 234 33 55 99 812
Sample Output
3 2 7 8 1 4 9 6 10 5 532.00
//标程:
#include<stdio.h> #include<iostream> using namespace std; int a[1100],b[1100]; int main() { // freopen("a.txt","r",stdin); int n,i,j,temp,ans; double sum; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) { scanf("%d",&a[i]); b[i]=i; } int temp; for(i=1;i<n;i++) { for(j=i+1;j<=n;j++) { if(a[i]>a[j]) { temp=a[i], a[i]=a[j], a[j]=temp; temp=b[i], b[i]=b[j], b[j]=temp; } } } int ans=0; double sum=0.0; for(i=1;i<=n;i++) { if(i==n) printf("%d\n",b[i]); else printf("%d ",b[i]); ans+=a[i]; sum+=ans; } printf("%.2lf\n",sum*1.0/n); } return 0; }