设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti,1≤i≤n。共有s处可以提供此项服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务完成的时间总和除以n。
输入 N个顾客的服务时间,并设置服务窗口数量s,请编程输出最小的平均等待时间和每个窗口上顾客接受服务的顺序。
#include<iostream>
using namespace std;
int min2(int d[],int m){ //找出最先空闲的服务台的下标
int min1=d[0],t;
for(int i=1;i<m;i++){
if(min1>=d[i]){
min1=d[i];
t=i;
}
}
return t;
}
int max2(int d[],int m){ //求出服务完的最短时间
int max1=d[0];
for(int i=1;i<m;i++){
if(max1<=d[i]){
max1=d[i];
}
}
return max1;
}
int main(){
int n,m;
cin>>n>>m; //输入顾客的数目n和服务台数目m
int t[n],d[m]={0}; //t[n]为n个顾客需要的服务时间,d[m]为m个服务台空闲时间
int s[m][n]={0}; //每个服务台所接待的顾客
int p[n]; //储存每个顾客对应的序号
for(int i=0;i<n;i++){
cin>>t[i];
p[i]=i+1;
}
for(int i=0;i<n;i++) //利用冒泡排序将数组的d[m]由大到小排序,并且用p[n]记录作业序号
for(int j=0;j<n-i-1;j++){
if(t[j]<t[j+1]){
int tp=t[j];
t[j]=t[j+1];
t[j+1]=tp;
tp=p[j];
p[j]=p[j+1];
p[j+1]=tp;
}
}
for(int i=0;i<m;i++){ //安排前m个顾客
s[i][0]=p[i];
d[i]=t[i];
}
int rear[m]={0};
for(int i=m;i<n;i++){ //安排剩下的n-m个顾客,使最先空闲的服务台先安排到顾客
int j=min2(d,m);
s[j][++rear[j]]=p[i];
d[j]=d[j]+t[i];
}
for(int i=0;i<m;i++){ //对结果进行输出
cout<<"服务台"<<i<<":";
for(int j=0;s[i][j]>0;j++){
cout<<"顾客"<<s[i][j]<<" ";
}
cout<<endl;
}
cout<<"最小的每个顾客平均等待时间为:"<<max2(d,m)/n;
return 0;
}