#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;
}