[题目]:设有n个顾客同时等待一项服务,顾客i需要的服务时间为ti(1<=i<=n)。假设只有1处提供此服务。
应如何安排n个顾客的服务次序才能使平均等待时间达到最小?(平均等待时间是n个顾客等待服务时间总和除以n)
输入:第一行为一个正整数n,表示有n个顾客
第二行为n个正整数,表示n个顾客需要的服务时间
输出:最小平均等待时间。
[解析]:有n个顾客同时等待一项服务,已知每位顾客所需服务时间,服务窗口为1。
故若有1位顾客等待此服务,他将直接被服务,等待时间为0。
若有2位顾客等待此服务,则在服务第一位顾客时,第二位顾客进入等待时间,在服务完第一位顾客时,第二位顾客开始被服务,所以第二位顾客等待时间为第一位顾客的服务时间t1。
以此类推:若有三位顾客,则等待总时间S=t1*2+t2*1+t3*0。由此可知想要最小等待总时长,最先被服务的顾客所需服务时间应该最小,最后被服务的顾客所需服务时间为最大。
#include <stdio.h>
void Swap(int *a, int *b)
{ // 交换函数
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int n, s = 0;
scanf("%d", &n);
int time[n];
printf("输入等待时间:");
for (int i = 0; i < n; i++)
{
scanf("%d", &time[i]);
}
// 所需服务时间排序
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (time[i] > time[j])
{
Swap(&time[i], &time[j]);
}
}
}
// 打印升序排序数组
// for (int i = 0; i < n; i++)
// {
// printf("%d ", time[i]);
// }
//计算等待总时长
for (int i = 0; i < n; i++)
{
s += time[i] * (n - i);
}
float avg = s * 1.0 / n;
printf("\n平均等待时长为:%.2f\n", avg);
return 0;
}