首页 > 其他分享 >【UVA 12100】Printer Queue 题解(队列+优先队列)

【UVA 12100】Printer Queue 题解(队列+优先队列)

时间:2023-10-03 14:01:13浏览次数:43  
标签:Printer 优先级 队列 题解 打印 作业 int 任务

计算机科学学生会中唯一的打印机正经历着极其繁重的工作量。有时,打印机队列中有100个作业,您可能需要等待数小时才能获得一页输出。由于某些作业比其他作业更重要,黑客将军为打印作业队列发明并实现了一个简单的优先级系统。现在,为每个作业分配1到9之间的优先级(9是最高优先级,1是最低优先级),打印机的操作如下。 •从队列中取出队列中的第一个作业J。 •如果队列中有某个作业的优先级高于作业J,则将J移至 不打印队列。 •否则,打印作业J(不要将其放回队列中)。 通过这种方式,黑客将军正在打印的所有重要松饼食谱都被打印出来了 迅速地当然,其他人正在打印的那些令人讨厌的学期论文可能需要等待很长时间 有时间印刷,但这就是生活。 你对新政策的问题是,确定何时打印变得相当棘手 这项工作将实际完成。你决定写一个程序来解决这个问题。该计划将 获得当前队列(作为优先级列表)以及作业在队列中的位置,以及 然后必须计算打印作业所需的时间,假设没有其他作业 将添加到队列中。为了简化问题,我们假设打印作业总是需要 一分钟,从队列中添加和删除作业是即时的。

【UVA 12100】Printer Queue 题解(队列+优先队列)_优先级

输入 一行带正整数:测试用例的数量(最多100个)。然后,对于每个测试用例: •一行包含两个整数n和m,其中n是队列中的作业数(1≤n≤100) m是你工作的位置(0≤m≤n−1)。队列中的第一个位置是数字0, 第二个是数字1,依此类推。 •一行包含1到9范围内的n个整数,给出队列中作业的优先级。这个 第一个整数给出第一个作业的优先级, 等等 输出 对于每个测试用例,用一个整数打印一行;工作完成前的分钟数 打印,假设没有其他打印作业到达。

Sample Input 3 1 0 5 4 2 1 2 3 4 6 0 1 1 9 1 1 1 Sample Output 1 2 5

思路

用一个结构体队列储存打印任务,结构体成员有优先级q和自己任务的标记m;用一个优先队列储存任务的优先级。读入任务,将自己的任务的m标记为true,其余任务的m标记为false。将任务的结构体放进任务队列,任务的优先级放进优先队列。

如果任务队列队头任务的优先级p与优先队列队头相等,则打印该任务,时间time增加1,让任务队列和优先队列队头出队。如果打印的任务是自己的任务,则输出时间,结束循环。如果任务队列队头任务的优先级p与优先队列队头不相等,则不打印该任务,将任务队列队头放回任务队列队尾后出队。重复该过程直到自己的任务被打印。

AC代码

#include <iostream>
#include <queue>
#include <vector>
#define AUTHOR "HEX9CF"
using namespace std;

int t;
struct S
{
    int p;
    bool m;
};

int main()
{
    cin >> t;
    while (t--)
    {
        int n, m;
        bool mine = false;
        int task;
        int time = 0;
        queue<S> q;
        priority_queue<int> pq;
        cin >> n >> m;
        for (int i = 0; i < n; i++)
        {
            cin >> task;
            if (i == m)
            {
                mine = true;
            }
            else
            {
                mine = false;
            }
            q.push(S{task, mine});
            pq.push(task);
        }
        while (1)
        {
            if (pq.top() == (q.front()).p)
            {
                time++;
                if ((q.front()).m)
                {
                    cout << time << endl;
                    break;
                }
                pq.pop();
                q.pop();
            }
            else
            {
                q.push(q.front());
                q.pop();
            }
        }
    }
    return 0;
}

标签:Printer,优先级,队列,题解,打印,作业,int,任务
From: https://blog.51cto.com/HEX9CF/7692727

相关文章

  • [题解]CF1748C Zero-Sum Prefixes
    UPD23.10.3更新的对思路的描述,以及代码。思路对于每一个\(a_i=0\),如果我们将它变为\(x\),都可以直接将\(i\simn\)位置上的前缀和加\(x\)。设\(a_j\)是\(a_i\)后第一个\(0\),那么,在\(j\)时同样有上述规律。所以,我们只需在\(i\)时考虑,\(i\sim(j-1)\)的贡......
  • 题解 [蓝桥杯 2016 省 B] 交换瓶子
    题目链接本题解讲解环图的做法。要将一个\(1\simn\)的排列通过交换变成\(1\simn\),可以先将\(i\)向\(a_i\)连边,那么最终一定会练成若干个环(每个点只有一个出度,也只有一个入度)。假设交换在同一个环中的节点,一个环显然会变成两个环,也就是说,交换一次最多增加一个环的数量,......
  • 【题解】洛谷 P1003 [NOIP2011 提高组] 铺地毯
    原题链接解题思路如果直接按照题意开一个二维数组来模拟每个点最上面的地毯编号,会发现所占空间最坏情况下约为(2*105)2*4B=4*1010*4B=1.6*1011B≈149GB,程序完全无法运行。但实际上没有必要将每一个点的信息记录下来,只需要记录每一块地毯能覆盖哪些点,再依次判断哪那些地毯可以......
  • 「题解」Codeforces Round 894 (Div. 3)
    A.GiftCarpetProblem题目Sol&Code签到题#include<bits/stdc++.h>#defineN21typedeflonglongll;intmin(inta,intb){returna<b?a:b;}intmax(inta,intb){returna>b?a:b;}intT,n,m,a[4];std::strings[N];i......
  • T2回家(home)题解
    T2回家(home)现在啥也不是了,虽然会了逆元,但是对期望概率题还是一窍不通,赛时相当于只推出了\(n=1\)的情况,结果运用到所有情况,理所应当只有20分。题目描述小Z是个路痴。有一天小Z迷路了,此时小Z到家有NN个单位长度。小Z可以进行若干次行动,每次行动小Z有\(\frac12\)的概率向......
  • [ARC035B] アットコーダー王国のコンテスト事情 题解
    前置芝士排列组合分析明显的贪心,第一问与此题思路相似,优先选择做时间少的,可以尽可能让后面的罚时尽量的小。难点在第二问,第二问问的是有几种可能性,有个显然的结论:相同做题时间的题目,位置调换答案仍然相同。那么可以用桶+排列组合来解决:用桶储存这个做题时间的出现次数\(b......
  • AT_abc321_f 题解
    #思路简单动态规划,$dp_i$指当前操作后取和为$i$的球的方案数,每次输出$dp_K$即可。需要注意的是对于每次`+x`操作,计算$dp$数组时要倒着循环。时间复杂度:$O(QK)$。#代码```cpp#include<bits/stdc++.h>usingnamespacestd;longlongdp[5010];intmain(){ longlon......
  • RDP远程登录后全屏,本地的任务栏始终显示的问题解决
    文章目录问题解决参考问题RDP远程登录后全屏,本地的任务栏(TaskBar)始终在下面,遮住了远程桌面的最下面,进行了解决。解决BestsolutionhowtohidelocalTaskbarwhenRDPtoaremotedesktopLaunchTaskManagerRight-click“WindowsExplorer”Select“Restart”Itworkson......
  • CodeForces-1276#B 题解
    正文这是样例1第1组数据的图。让我们观察一下,路径1->6、1->7、2->6、2->7是可行的,所以答案为4。上述路径中好像点4没有贡献?再看看样例1第2组数据的图。发现点1和点4相互之间存在其他路径,无需经过点\(a\)和点\(b\)。综上,我们可以知道:在\(a\)和\(b\)......
  • AT_abc279_g [ABC279G] At Most 2 Colors 题解
    题解\(dp[i]\)表示长度为i的格子的合法涂色数,考虑第\(i\)个怎么放第\(i\)个前面\(k-1\)个位置有2种颜色,则第\(i\)个位置只能放这两种颜色中的一种用合法方案减只有一种的方法,即得两种颜色的方案数而只有一种颜色的方案数,等于\(f[i-k+1]\),此时,让中间的\(k-2\)个......