题目描述
有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。
输入输出格式
输入格式:
输入文件共两行,第一行为n;第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。
输出格式:
输出文件有两行,第一行为一种排队顺序,即1到n的一种排列;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
思路
排序+贪心。
首先我们要排的是所有的元素,但是为什么是从小到大呢???
由于若把时间长的放在后面接水,那么就较少人等,所以排序+贪心即可。
对于每一个人,在场剩余每个人都要经历一次他的打水时间。
故遍历整个数组求其他人在这个人打水时花费的总时间累加到变量sum上,最后sum除以n(算平均值)。
注意:
1.数据规模 要用long long 或double;
2.数据形式转换,整型除以整型是要取整的
#include <stdio.h>
#include <iostream>
#include <algorithm>
int main()
{
int n;
long long a[1001]={},b[1001]={};
scanf("%d",&n);
int i,j;
double sum=0;
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);//a数组记录时间
b[i]=i;//b数组记录编号
}
int t;//临时变量t
for(i=1;i<=n-1;i++)
for(j=1;j<=n-i;j++)
{//冒泡排序
if(a[j]>a[j+1])//如果前一个人的时间比后一个人的时间长
{
t=a[j];a[j]=a[j+1];a[j+1]=t;//交换
t=b[j];b[j]=b[j+1];b[j+1]=t;//同理
}//也可以使用iostream中的swap
}//也可以使用algorithm的sort
double num=0;
for(i=1;i<=n;i++)
{
num=0;
for(j=i-1;j>=1;j--)
{
num+=a[j];//累加等待时间
}
//printf("%d ",num);//累加等待时间
sum = sum+num;
}
for(i=1;i<=n;i++)
{
printf("%lld ",b[i]);//先输出编号
}
printf("\n%.2f",sum/n);//平均值
return 0;
}