1014 Waiting in Line

该博客讲述了作者在解决编程题目时遇到的问题和解决过程。题目涉及模拟银行服务系统,记录每个人开始办理业务的时间,并根据业务时间和队列状态计算客户离开的时间。作者通过不断调试和优化代码,最终成功通过了所有测试用例。文章讨论了队列数据结构在解决问题中的应用,并展示了关键代码片段。
摘要由CSDN通过智能技术生成

随便说说:

这题写吐了,一开始题没读明白,后来又一直段错误,找了好久发现有个地方队列没判空,改的时候也优化了许多地方,弄了一上午终于过了555

思路:

记录每个人开始办业务的时间,上一个人走的时间加上他的开始时间就是下一个人的开始的时间,然后就是用队列模拟每一条队,输出的时候先判断他排上队的时间,然后加上他办理的时间,就是他走的时间。

Code:

#include <iostream>
#include <vector>
#include <string>
#include <queue>

using namespace std;

const int N = 2010;

int num[N]; // 排上队的时间

string time(int t) // 0 - 540
{
    string s;
    t += 8 * 60;
    s = t / 60 < 10 ? "0" + to_string(t / 60) : to_string(t / 60);
    s += ":";
    t %= 60;
    s += t < 10 ? "0" + to_string(t) : to_string(t);
    return s;
}

int main()
{
    int n, m, k, Q; // 20 10 1000 1000
    cin >> n >> m >> k >> Q;
    vector<int> a(k + 1);
    for (int i = 1; i <= k; i++)
    {
        cin >> a[i];
    }
    queue<int> q[25];
    int t = 1;
    for (int i = 1; i <= n * m && i <= k; i++)
    {
        if (t == n + 1) t = 1;
        q[t].push(i);
        t++;
    }
    for (int i = n * m + 1; i <= k; i++)
    {
        for (int i = 1; i <= n; i++)
        {
            if (q[i].size())
            {
                t = i;
                break;
            }
        } // 找个不空的队列,作为判断的第一个队
        for (int j = 2; j <= n; j++) // 找一个最早走的
        {
            if (q[j].empty()) continue; // 空的跳过,不然段错误
            int x = q[j].front(), y = q[t].front();
            if (num[x] + a[x] < num[y] + a[y])
            {
                t = j;
            }
        }
        int x = q[t].front();
        q[t].pop();
        q[t].push(i);
        num[q[t].front()] = num[x] + a[x];
    }
    bool flag = true;
    while (flag)
    {
        flag = false;
        for (int i = 1; i <= n; i++)
        {
            if (q[i].size())
            {
                t = i;
                flag = true;
                break; // 所有队都空了就结束了
            }
        }
        if (!flag) break;
        for (int j = 2; j <= n; j++) // 找一个最早走的
        {
            if (q[j].empty()) continue; // 防止段错误
            int x = q[j].front(), y = q[t].front();
            if (num[x] + a[x] < num[y] + a[y])
            {
                t = j;
            }
        }
        int x = q[t].front();
        q[t].pop();
        if (q[t].empty()) continue; // 不同的是这里没有push了,所有人都有了自己的队
        num[q[t].front()] = num[x] + a[x];
    }

    for (int i = 1; i <= Q; i++)
    {
        cin >> t;
        if (num[t] < 540)
        {
            cout << time(a[t] + num[t]) << endl;
        }
        else
        {
            cout << "Sorry" << endl;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值