UVa12100 - Printer Queue

本文介绍了一种使用优先级队列实现的任务调度算法,该算法能够根据任务的优先级进行有效排序,并通过普通队列记录任务的实际执行顺序。通过实例演示了如何在有优先级差异的任务集合中正确地调度并完成所有任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给出n个有优先级的job,9表示优先级最高,1表示优先级最低,如果队列中有比队首优先级更高的job,将队首的job移到队尾,否则移出队首job打印

思路:用优先级队列来排序,将优先级最高的job放到 队首,用普通队列来存取job的顺序。

代码 如下:

#include <iostream>
#include <fstream>
#include <queue>

class Solution
{
public:
    void init(int n, int m)
    {
        this-> n = n; this->m = m;
    }

    void setA(int i, int n)
    {
        a[i] = n;
    }

    int solve()
    {
        std::queue<Node> queue;
        std::priority_queue<int> pq;
        for (int i = 0; i < n; i++)
        {
            Node node;
            node.pos = i; node.num = a[i];
            queue.push(node);
            pq.push(a[i]);
        }

        int time = 0;
        while (!queue.empty())
        {
            Node node = queue.front();

            if (node.num >= pq.top())
            {
                time++;
                pq.pop();
                queue.pop();
                if (node.pos == m) break;
            }
            else
            {
                queue.pop();
                queue.push(node);
            }
        }

        return time;
    }

private:
    class Node
    {
    public:
        int pos;
        int num;

        bool operator < (Node& b) const
        {
            return num < b.num;
        }
    };
private:
    static const int N = 101;
    int a[N];
    int n, m;
};

int main() {
#ifndef ONLINE_JUDGE
    std::ifstream fin("f:\\oj\\uva_in.txt");
    std::streambuf* old = std::cin.rdbuf(fin.rdbuf());
#endif

    int t;
    Solution solver;
    std::cin >> t;
    for (int i = 1; i <= t; i++)
    {
        int n, m;
        std::cin >> n >> m;
        solver.init(n, m);
        for (int i = 0; i < n; i++)
        {
            int a;
            std::cin >> a;
            solver.setA(i, a);
        }

        int ans = solver.solve();

        std::cout << ans << std::endl;

    }
#ifndef ONLINE_JUDGE
    std::cin.rdbuf(old);
#endif
    return 0;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值