题目描述
有 n 个人在一个水龙头前排队接水,假如每个人接水的时间为
T
i
T_i
Ti,请编程找出这 n 个人排队的一种顺序,使得 n 个人的平均等待时间最小。
输入格式 第一行为一个整数 n。
第二行 n 个整数,第 i 个整数
T
i
T_i
Ti 表示第 i 个人的等待时间
T
i
T_i
Ti。
输出格式 输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
输入输出样例
输入
10
56 12 1 99 1000 234 33 55 99 812
输出
3 2 7 8 1 4 9 6 10 5
291.90
说明/提示
n≤1000,
t
i
<
=
1
0
6
t_i<=10^6
ti<=106 不保证 ti 不重复。
当
t
i
t_i
ti重复时,按照输入顺序即可(sort 是可以的)
代码
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
typedef long long ll;
typedef struct str;
struct str {
int second;
ll first;
};
int cmp(const void* a, const void* b) {
return (*(str*)a).first - (*(str*)b).first;
}
int main() {
int n, i;
scanf("%d", &n);
str* a = (str*)malloc(sizeof(str) * n);
double sum = 0;
for (i = 0;i < n;i++) {
scanf("%lld", &(a + i)->first);
(a + i)->second = i + 1;
}
qsort(a, n, sizeof(a[0]), cmp);
for (i = 0;i < n;i++) {
sum += (double)(a + i)->first * (n - i - 1);
printf("%d ", (a + i)->second);
}
printf("\n%.2lf", sum/n);
return 0;
}
在测试的时候忘记在sum的累加上×n-i+1了