问题描述:

设有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;
}