Bootstrap

银行排队问题之单队列多窗口服务

#include <stdio.h>///主要使用结构体数组(c++中的类为元素的数组)
#include <stdlib.h>
typedef struct 
{
    int arrivalTime, serviceTime; 
// arrivalTime: 到达时间, serviceTime: 服务时间
} Customer;

Customer customerQueue[1005]; // 顾客队列(一个数组元素存两种信息)
int windowProcessingTime[11] = {0}; // 每个窗口的总处理时间
int windowCustomerCount[11] = {0}; // 每个窗口处理的顾客数量

int main() 
{
    int numCustomers, numWindows, queueStart = 0, queueEnd = 0;
    int totalWaitTime = 0, maxWaitTime = 0;

    // 读取顾客数量
    scanf("%d", &numCustomers);
    for (int i = 0; i < numCustomers; i++){
        scanf("%d%d", &customerQueue[queueEnd].arrivalTime, &customerQueue[queueEnd].serviceTime);
        if (customerQueue[queueEnd].serviceTime > 60) customerQueue[queueEnd].serviceTime = 60; // 服务时间最多为60
        queueEnd++;
    }

    // 读取窗口数量
    scanf("%d", &numWindows);

    // 处理每个顾客
    while (queueStart < queueEnd)///顾客总数的队列没遍历完
     {
        int windowFound = 0, minProcessingTime = 99999, minWindowIndex = 0;
///逻辑重点:从前往后找合适的窗口:空闲窗口、等待时间最短的窗口(及时更新信息)
        for (int i = 0; i < numWindows; i++) {
           ///空闲窗口:直接服务
            if (windowProcessingTime[i] <= customerQueue[queueStart].arrivalTime) {
                ///服务时间:服务完成时的时刻!!!
                windowProcessingTime[i] = customerQueue[queueStart].arrivalTime + customerQueue[queueStart].serviceTime;
                windowCustomerCount[i]++;
                windowFound = 1;
                break;
            }
            ///等待时间最短的窗口:服务完成最早
            if (windowProcessingTime[i] < minProcessingTime) {
                minProcessingTime = windowProcessingTime[i];
                minWindowIndex = i;
            }
        }
           ///没有找到空闲窗口:在等待时间最短的窗口服务
        if (windowFound==0) {
            ///计算等待时间=(服务时间最短:最先能空出来、时刻)服务时间-到达时间
            int waitTime = minProcessingTime - customerQueue[queueStart].arrivalTime;
            if (maxWaitTime < waitTime) maxWaitTime = waitTime; // 更新最长等待时间
            totalWaitTime += waitTime;
            ///该窗口(没空闲窗口时等待时间最短的窗口:下标特殊性)的服务完成时间更新
            windowProcessingTime[minWindowIndex] = minProcessingTime + customerQueue[queueStart].serviceTime;
            windowCustomerCount[minWindowIndex]++;
        }
        queueStart++;
    }

    // 找到最后处理完的窗口
    int lastWindowFinishTime = 0;
    ///比大小找服务时间最大的窗口:最后完成时间
    for (int i = 0; i < numWindows; i++) {
        if (lastWindowFinishTime < windowProcessingTime[i]) lastWindowFinishTime = windowProcessingTime[i];
    }

    // 打印结果
    printf("%.1lf %d %d\n", 1.0 * totalWaitTime / numCustomers, maxWaitTime, lastWindowFinishTime);
    for (int i = 0; i < numWindows; i++) {
        printf("%d", windowCustomerCount[i]);
       ///行最后一个元素和其它元素输出格式的区别:后面是换行符不是空格
        if (i == numWindows - 1) printf("\n");
        else printf(" ");
    }

    return 0;
}

 

 

;