n个顾客等待一项服务,顾客i的等待时间是ti,共有s处提供此服务,应怎么安排能使得顾客的平均等待时间最短
//将 按照顾客的服务时间从小到大排序,然后依次将顾客分配到s个窗口,如果窗口满了,在依次从第一个窗口开始统计的服务时间总数就是等待时间
#include <iostream>
#include <vector>
using namespace std;
double greedy(vector<int> client,int s)
{
vector<int> service(s+1,0);
vector<int> sum(s+1,0);
int n = client.size();
double t=0;
sort(client.begin(),client.end());//按照顾客的服务时间从小到大排序
int i=0, j=0;//i是顾客的指针,j是窗口的指针
while(i < n)
{
service[j] += client[i];
sum[j] += service[j];
++i,++j;
if(j == s) j = 0;
}
for(i=0; i<s; ++i) t += sum[i];
t /= n;
return t;
}
int main()
{
vector<int> queue;
int n, s;
scanf("%d%d", &n, &s);
int temp;
for(int i=0; i<n; i++)
{
scanf("%d", &temp);
queue.push_back(temp);
}
printf("%.3lf\n", greedy(queue, s));
}