#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
int main()
{
//1. 从标准输入读取人数n,对应题目中在水龙头前排队接水的人数
int n;
cin >> n;
//2. 定义数组N,用于存储每个人接水的时间,数组大小设定为1000
//(可根据实际情况容纳足够多的人,不过实际使用个数由n决定)
//这里的N[i]就对应题目中的Ti,表示第i个人的接水时间
int N[1000];
for (int i = 0; i < n; i++)
cin >> N[i];
//3. 定义数组T,用于复制数组N中的元素
//目的是对复制后的数组进行排序等操作,同时保持原数组N不变,方便后续查找原始顺序。
//本质上,T数组存储的也是每个人的接水时间数据,只是后续会对它进行排序处理来确定排队顺序
int T[1000];
for (int i = 0; i < n; i++)
T[i] = N[i];
//4. 使用标准库中的sort函数对数组T进行排序(从小到大排序)
//按照接水时间从小到大排列这些人的顺序
//因为按照贪心算法的思想,接水时间短的人先接水可以使总的平均等待时间最短
//(sort函数需要包含<algorithm>头文件)
//这里传入的参数表示要排序的范围是从T数组的首地址到第n个元素的地址
sort(T, T + n);
//5. 定义一个双精度浮点数sum,用于累加计算所有人等待时间的总和,初始化为0
//后续会根据确定的排队顺序来计算总的等待时间
//最终用它除以人数n得到平均等待时间
double sum = 0;
//6. 定义临时数组temp,同样大小为1000
//用于辅助后续查找每个人接水时间在原数组中的原始位置等操作,初始时将N数组元素复制过来
//这样可以基于这个临时数组去查找每个人最初的序号
//(对应题目要求输出的排队顺序是基于最初输入的人员顺序)
int temp[1000];
for (int i = 0; i < n; i++)
temp[i] = N[i];
//7. 开始外层循环,遍历排序后的数组T
//以按照接水时间从小到大的顺序确定排队顺序,并计算相应的等待时间以及累加总和
for (int i = 0; i < n; i++)
{
//8. 在内层循环中,通过逐个比较查找当前排序后数组T中元素(即当前接水时间)
在原数组temp中的原始位置(下标),初始j为0
//这个原始位置就对应着最初输入的第几个接水人的序号,找到这个序号才能按要求输出排队顺序
int j = 0;
while (temp[j]!= T[i])
j++;
//9. 找到元素在temp数组中的位置后,将该位置的元素值置为0
//避免后续重复查找(标记已处理过),同时这一步也是为了配合查找逻辑的正确性
//确保每次都能准确找到下一个未处理的对应元素位置
temp[j] = 0;
//10. 输出该元素在原数组中的位置序号
(因为数组下标从0开始,所以要加1输出,符合日常计数习惯,也就是输出第几个接水人先接水)
//这里输出的顺序就是按照平均等待时间最短的排队顺序来输出的
cout << j + 1;
//11. 如果当前不是最后一个元素,就在输出位置序号后添加一个空格
用于隔开不同接水人的序号,使输出格式更清晰
if (i!= n - 1)
cout << " ";
//12. 根据题目要求计算加权总和,权重是(n - i - 1)
//表示当前这个人前面有(n - i - 1)个人需要等待他接水
//所以每个人的等待时间就是他的接水时间乘以前面等待的人数,这里乘以当前元素值
(转换为浮点数类型)累加到sum中
//用于后续计算平均等待时间
sum += T[i] * (n - i - 1) * 1.0;
}
//13. 输出换行符,进行换行操作,使后面输出的平均等待时间与前面排队顺序的输出分行显示
cout << '\n';
//14. 使用fixed和setprecision(2)控制输出格式,使得后面输出的平均等待时间保留两位小数
//然后输出计算得到的平均等待时间
//满足题目要求的第二行输出内容,即输出这种排列方案下的平均等待时间
cout << fixed << setprecision(2) << sum / (n * 1.0);
return 0;
}