A.排队打水
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Description
我校每栋寝室的每两层楼才一个打热水的地方,因此怎样减少打水时间是一个有趣的问题。 假设有 n 个人在一个水龙头前排队接水,假如每个人接水的时间为 ti,请编程找出这 n 个 人排队的一种顺序,使得 n 个人的平均等待时间最小。
Input
有多组输入数据。
每组数据两行,第一行为一个整数 n(1£ n£ 100000),表示排队的人数。 接下来第二行 n 个整数 ti(1£ ti£ 1000),表示每个人接水水所需要的时间。
Output
对于每组数据,输出占两行。第一行为一种排队顺序,即1到 n 的一种排列,每个数字之间 一个空格, 如果答案有多个, 输出字典序最小的序列(即当时间相同时, 先出现的序号先输 出); 第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
Sample Input
4
2 3 3 1
10
56 12 1 99 1000 234 33 55 99 812
Sample Output
4 1 2 3
2.50
3 2 7 8 1 4 9 6 10 5
291.90
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int n;
struct Node
{
int t,num;
} Node[100000];
bool cmp(struct Node a,struct Node b)
{
return a.t<=b.t;
}
int main()
{
while(~scanf("%d",&n))
{
memset(Node,0,sizeof(Node));
for(int i=1; i<=n; i++)
{
scanf("%d",&Node[i].t);
Node[i].num=i;
}
sort(Node+1,Node+n+1,cmp);
for(int i=1; i<=n; i++)
printf("%d ",Node[i].num);
printf("\n");
double sum=0,s=0;
for(int i=1; i<=n; i++)
{
sum+=s;
s+=Node[i].t;
}
printf("%.2lf\n",sum/n);
}
return 0;
}