洛谷-P1223 排队接水
题目描述
有 n 个人在一个水龙头前排队接水,假如每个人接水的时间为 (T_i),请编程找出这 n 个人排队的一种顺序,使得 n 个人的平均等待时间最小。
输入格式
第一行为一个整数 n。
第二行 n 个整数,第 i 个整数 (T_i) 表示第 i 个人的等待时间 (T_i)。
输出格式
输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
输入输出样例
输入 #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
说明/提示
(nle1000,t_ile10^6),不保证 (t_i) 不重复。
当 (t_i) 重复时,按照输入顺序即可(sort 是可以的)
C++代码
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
struct node {
int id;
int t;
bool operator<(const node &y)const{
if(y.t==t)
return id<y.id;
return t<y.t;
}
}p[1000];
int main() {
int n,i,time=0;
double ans=0;
cin>>n;
for(i=0;i<n;++i) {
p[i].id=i+1;
cin>>p[i].t;
}
sort(p,p+n);
for(i=0;i<n;++i) {
cout<<p[i].id<<' ';
ans+=time;
time+=p[i].t;
}
printf("
%.2f
",ans/n);
return 0;
}