PAT甲级1014Waiting in Line

时间:2021-01-29 12:06:55   收藏:0   阅读:0

题目介绍

题解

解题思路

// Problem: PAT Advanced 1014
// URL: https://pintia.cn/problem-sets/994805342720868352/problems/994805498207911936
// Tags: 队列

#include <iostream>
#include <queue>
using namespace std;

queue<int> window[20]; // n个窗口,每个窗口是一个排队队列
int processingTime[1001]; // k个客户需要的分钟数,index为[1,k]
int finishTime[1001]; // k个客户结束服务的时间,index为[1,k]

int main()
{
    // 变量定义并初始化
    int customerIndex = 1; // 客户索引,后面用来遍历客户
    int n, m, k, q; // 窗口个数、单个窗口队伍最大长度、客户数量、查询数量
    scanf("%d %d %d %d", &n, &m, &k, &q);
    for (int i=1; i <= k; i++)
        scanf("%d", processingTime+i);

    // 处理前n×m个客户(内循环:在n个窗口中选择1个窗口入队。外循环:使内循环重复m次达到n×m的效果)
    while(m--){
        for (int j=0; j < n && customerIndex <= k; j++){ // 客户优先选择队伍最短、索引最小的窗口
            if (window[j].empty()){ // 如果队伍是空的,那该客户在8:00开始服务,其完成服务的时间就等于其服务时长
                finishTime[customerIndex] = processingTime[customerIndex];
            }
            else{
                finishTime[customerIndex] = finishTime[window[j].back()] + processingTime[customerIndex]; // 该客户完成服务的时间=队尾客户完成服务的时间+该客户的服务时长
            }
            window[j].push(customerIndex); // 当前客户入队
            customerIndex++; // 更新客户索引(考虑下一位客户)
        }
    }

    // 如果还剩有客户的话,处理剩下的客户
    while(customerIndex <= k){
        int quickestFinishTime = finishTime[window[0].front()], quickestWindow = 0; // 找出队伍最短的窗口
        for (int i=1; i < n; i++){
            if (finishTime[window[i].front()] < quickestFinishTime){
                quickestFinishTime = finishTime[window[i].front()];
                quickestWindow = i;
            }
        }
        finishTime[customerIndex] = finishTime[window[quickestWindow].back()] + processingTime[customerIndex]; // 记录当前客户结束服务的时间
        window[quickestWindow].pop();
        window[quickestWindow].push(customerIndex);
        
        customerIndex++;
    }

    int query_customer;
    while(q--){
        scanf("%d", &query_customer);
        if (finishTime[query_customer] - processingTime[query_customer] < 540){
            printf("%02d:%02d\n", finishTime[query_customer]/60+8, finishTime[query_customer]%60);
        }else{
            printf("Sorry\n");
        }
    }
    return 0;
}

参考链接


Github(github.com):@chouxianyu

Github Pages(github.io):@臭咸鱼

知乎(zhihu.com):@臭咸鱼

博客园(cnblogs.com):@臭咸鱼

B站(bilibili.com):@绝版臭咸鱼

微信公众号:@臭咸鱼的快乐生活

转载请注明出处,欢迎讨论和交流!


评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!