问题描述
设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti(1<=i<=n),共有s处可以提供此项服务。应如何安排n个顾客的服务次序,才能使平均等待时间达到最小?
平均等待时间是n个顾客等待服务时间的总和除以n
#include<iostream>
using namespace std;
//将数组从大到小排序
void Sort(int*a,int n){
int i,j,t;
for(i=0;i<n;i++){
int max=i;
for(j=i;j<n;j++){
if(a[max]<a[j]){
max=j;
}
}
t=a[i];
a[i]=a[max];
a[max]=t;
}
}
//将数组从小到大排序
void SortMin(int*a,int n){
int i,j,t;
for(i=0;i<n;i++){
int min=i;
for(j=i;j<n;j++){
if(a[min]>a[j]){
min=j;
}
}
t=a[i];
a[i]=a[min];
a[min]=t;
}
}
int main(void){
int i,k,n;
cin>>n>>k;
int *a;
a=new int[n];
for(i=0;i<n;i++){
cin>>a[i];
}
int *s;
s= new int[k];
SortMin(a,n);//将顾客的时间按照从小到大排序
// for(i=0;i<n;i++){
// cout<<a[i]<<" ";
// }
// cout<<endl;
int t,j=0,w=0;
for(i=0;i<k;i++,j++){
s[i]=a[j];
w=w+s[i];
}
t=a[0];
j=j-1;
while(j<n-1){
Sort(s,k);//选出用时最小的窗口
// for(i=0;i<k;i++){
// cout<<s[i]<<" ";
// }
// cout<<endl;
j=j+1;
s[k-1]=s[k-1]+a[j];//将下一个顾客加入到结束的窗口
w=w+a[j];
if(s[k-1]>t){
t=s[k-1];
w=w+t-a[j];
// cout<<t<<endl;
}
}
// cout<<t<<endl;
cout<<w/n<<endl;
delete a;
delete s;
}
测试样例