题目描述
有 �n 个人在一个水龙头前排队接水,假如每个人接水的时间为 ��Ti,请编程找出这 �n 个人排队的一种顺序,使得 �n 个人的平均等待时间最小。
输入格式
第一行为一个整数 �n。
第二行 �n 个整数,第 �i 个整数 ��Ti 表示第 �i 个人的等待时间 ��Ti。
输出格式
输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
输入输出样例
输入 #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
说明/提示
1≤�≤10001≤n≤1000,1≤��≤1061≤ti≤106,不保证 ��ti 不重复。
#include <bits/stdc++.h>
#define int long long
using namespace std;
//const int MAXN = 200 + 10;
//int n, na, nb, a[MAXN], b[MAXN], cnta, cntb;
//int vs[5][5] = {{0,0,1,1,0},{1,0,0,1,0},{0,1,0,0,1},{0,0,1,0,1},{1,1,0,0,0}}; //得分表的处理
void solve(){
}
struct node{
int num,ti;
}ch[1011];
inline bool cmp(node a,node b){
if(a.ti!=b.ti ){
return a.ti<b.ti;
}
return a.num<b.num;
}
double ans;
signed main()
{
int n;//ch[n+1],num[n+1];
cin>>n;
for(int i=1;i<=n;i++){
cin>>ch[i].ti;
ch[i].num=i;
}
sort(ch+1,ch+n+1,cmp);
for(int i=1;i<=n;i++){
cout<<ch[i].num<<" ";
}
printf("\n");
for(int i=1;i<=n;i++){
ans+=i*ch[n-i].ti;//pay attention to
}
ans=ans/n;
printf("%.2f",ans);
}