问题描述:
设有n 个顾客同时等待一项服务。顾客i需要的服务时间为ti ,1<= i <= n。共有s 处可以提供此项服务。应如何安排n 个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。
编程任务:
对于给定的n个顾客需要的服务时间和s的值,编程计算最优服务次序。
数据输入:
第一行有2 个正整数n 和s,表示有n 个顾客且有s 处可以提供顾客需要的服务。接下来的1 行中,有n个正整数,表示n个顾客需要的服务时间。
结果输出:
最小平均等待时间。
输入示例
10 2
56 12 1 99 1000 234 33 55 99 812
输出示例
336
问题分析:
A[n] = {56,12,1,99,1000,234,33,55,99,812}
/ B[0] 1 33 56 99 812
s处服务点
\ B[1] 12 55 99 234 1000
等待时间B[0] = A[0] C[0] = B[0] = A[0]
B[1] = A[1] C[1] = B[1] = A[1]
B[0] = A[0] + A[2] C[0] = 2 A[0] + A[2]
B[1] = A[1] + A[3] C[1] = 2A[1] + A[3]
以此类推 ,原理如同最优服务次序。
C[0] = 5A[0] + 4 A[2] + 3A[4] +2 A[6] + A[8]
C[1] = 5A[1] + 4 A[3] + 3A[5] +2 A[7] + A[9]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 10
/*
多处最优服务次序,输入n个顾客的服务时间和s处提供此项服务。输出最小平均等待时间。
*/
int s,n;
int B[SIZE]; //存储服务点
int C[SIZE]; //存储服务等待时间
double greedy(int A[]);
void sort(int A[]);
void swap(int *a,int *b);
int main()
{
int i,j,temp;
printf("请输入顾客数目和服务点个数:\n");
scanf("%d %d",&n,&s);
int A[n];
printf("请输入每个顾客的服务时间:\n");
for(i = 0;i < n;i++)
{
scanf("%d",&A[i]);
}
for(i=0;i<n;i++){ //按服务时间由小到大排列
for(j=i+1;j<n;j++){
if(A[i]>A[j]){
temp=A[i];A[i]=A[j];A[j]=temp;
}
}
}
printf("最小平均等待时间:%lf",greedy(A));
return 0;
}
double greedy(int A[])
{
int i= 0 ,j = 0;
while(i < n)
{
B[j] += A[i];
C[j] += B[j]; //C[i] 存储每个顾客的等待时间
i++;
j++;
if(j == s) //安排s个服务点的活动
{
j = 0;
}
}
double t=0;
for(i = 0;i < s;i++)
t += C[i]; //每个服务点的等待时间累加
return t/n;
}