题目描述
夏天到了,又到了用水高峰期,偏巧小区的水管出了点问题,消防车赶紧给小区送了一车水过来。小区居民们纷纷拿出自家装水的容器,有的是个大塑料瓶,有的是茶水壶,有的是小塑料桶,哈哈,什么样的都有:)。现在有n个人在一个水龙头前排队接水,假设每个人接水的时间分别为Ti,请编程找出这n个人排队的一种顺序,使得这n个人的平均等待时间最小。
输入要求
输入有多组测试数据
每组测试数据共两行,第一行为一个整数n,表示有n个人;
输出要求
输出文件有两行,第一行为一种排队顺序,即编号从1到n的n个人的一种排序方式;
第二行为这种排序方案下的平均等待时间(输出结果精确到小数点后两位)。
输入样例
10
56 12 1 99 1000 234 33 55 99 812
输出样例
3 2 7 8 1 4 9 6 10 5
291.90
**
代码
看到这种题目就想用结构体排序嘿嘿嘿
#include <bits/stdc++.h>
using namespace std;
typedef struct A
{
int xb;//下标
int time;//时间
} A;
bool cmp(A a,A b)
{
return a.time<b.time;
}
int main()
{
A a[1001];
int i,n,t=0;
double sum=0;
int lp;
while(cin>>n)
{
t=0,sum=0;
memset(a,0,sizeof(a));
for(i=0; i<n; i++)
{
cin>>a[i].time;
a[i].xb=t++;
}
sort(a,a+t,cmp);
for(i=0; i<t-1; i++)
{
cout<<a[i].xb+1<<" ";
sum+=a[i].time*(t-1-i);//当前接水时间*当前排队人数
}
sum+=a[i].time*(t-1-i);
cout<<a[i].xb+1<<endl;
//cout<<sum<<endl;
printf("%.2lf\n", sum / n);
}
}