问题描述:
设有n个顾客同时等待一项服务。顾客 i 需要的服务时间是 ti,共有s处可以提供此项服务。应如何安排n个顾客的服务次序,才能使平均等待时间达到最小?平均等待时间使n个顾客等待服务的总时间的和除以n。
输入:
10 2
56 12 1 99 1000 234 33 55 99 812
输出:
336
思路:
我们同样知道肯定是先需要服务时间短的客户先被服务,但是又多个窗口,这其中具体安排客户应该准受怎样的规则呢?其实我们可以考虑计算每个窗口的工作时间,每次窗口服务一个人时,该窗口之前工作的时间就是该人等待的时间。
code:
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int N = 10010;
int a[N];
int b[N]; // 每个客户在得到窗口之前等待的时间
int sum[N]; // 每个窗口对其所用客户等待时间之和
int main()
{
int n, s;
cin >> n >> s;
for(int i = 0; i < n; i++)
cin >> a[i];
sort(a, a+n);
memset(b, 0, sizeof(b));
memset(sum, 0, sizeof(sum));
int j = 0;
for(int i = 0; i < n; i++)
{
b[j] += a[i]; // 窗口每接待一个客人就要增加等待时间
sum[j] += b[j]; // 累和所有使用过该窗口的客人
j++;
if(j == s)
j = 0;
}
int ans = 0;
for(int i = 0; i < s; i++)
ans += sum[i];
cout << 1.0 * ans / n << endl;
return 0;
}