设有n个顾客同时等待一项服务,顾客i需要的服务时间为ti,1≤i≤n,共有s处可以提供此项服务。
应如何安排n个顾客的服务次序才能使平均等待时间达到最小?
平均等待时间是n个顾客等待服务时间的总和除以n。
给定的n个顾客需要的服务时间和s的值,编程计算最优服务次序。
输入
第一行有2个正整数n和s,表示有n个顾客且有s处可以提供顾客需要的服务。接下来的1行中,有n个正整数,表示n个顾客需要的服务时间。
输出
最小平均等待时间,输出保留3位小数。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> a;
//顾客等待的队列为client,提供服务的窗口s个
double greedy(vector<int> client, int s)
{
vector<int> service(s, 0); //服务窗口的单个顾客等待时间
vector<int> sum(s, 0); //服务窗口顾客等待时间的总和
int n = client.size(); //顾客的数量
sort(client.begin(), client.end());
int i = 0; //顾客的指针
int j = 0; //窗口的指针
while (i < n) {
service[j] += client[i]; //进行转换
sum[j] += service[j]; //每个窗口的“服务时间”总和
i++;
j++;
if (j == s) //窗口排完一边,再从第一个窗口进行排序
j = 0;
}
double t = 0; //计算所有窗口服务时间的总和
for (int i = 0; i < s; i++)
t += sum[i];
t = t / n;
return t;
}
int main()
{
//vector<int> a;
a = { 56,12,1,99,1000,234,33,55,99,812 };
int service;
cin >> service;
int m = greedy(a, service);
cout << m;
}