排队接水
|
Time Limit 1000ms | Memory Limit 65536K |
|
description |
有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。
|
input |
输入文件共两行,第一行为n(1<=n<=1000),第二行分别表示第1个人到第n个人每人的接水时间T1,T2,……Tn,(0<=Ti<=10000)每个数据之间有1个空格。
|
output |
输出文件有两行,第一行为一种排队顺序,即1到n的一种排列;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)
|
sample_input |
10
56 12 1 99 1000 234 33 55 99 812
|
sample_output |
3 2 7 8 1 4 9 6 10 5
291.90
掌握贪心的精髓 最符合眼前利益的先做 因此按从大到小的顺序排列 然后统计 等候时间 |
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
struct ASS
{
int num;
int use;
}p[1000];
bool cmp(ASS x,ASS y)
{
return x.use<y.use;
}
int a[1000];
int main()
{
int n;
while(cin>>n)
{
for(int i=1;i<=n;i++)
{
cin>>p[i].use;
p[i].num=i;
}
sort(p+1,p+1+n,cmp);
a[0]=p[0].use=0;
double t=0;//只有相除的两个数中含有double 型的,相除才能得到小数部分
for (int i=1;i<=n;i++)
{
a[i]=a[i-1]+p[i].use;//统计的是每个人等候的时间
t+=a[i-1];
}
double ans=t/n;
for(int i=1;i<n;i++)
cout<<p[i].num<<" ";
cout<<p[n].num<<endl;
printf("%.2lf\n",ans);
}
return 0;
}