题目描述

我们需要用打印机打印任务。每个任务都有1~9间的优先级,优先级越高,任务越急。

打印机的运作方式:从打印队列里取出一个任务j,如果队列里有比j更急的任务,则直接把j放到打印队列尾部,否则打印任务j。每次打印都消耗一分钟的时间,但调整任务位置不消耗时间。

输入

第一行:n个测试用例

第二行:m1(任务个数) m2(我们关注的任务所在位置)

第三行:m1个任务的优先级。

输出

我们关注的任务完成后的时刻。

举例

输入:

1            1个测试用例

4 2            4个任务,我们关注的任务位于4个任务中的第三个(从第0个开始)

1 2 3 4          4个任务的优先级

分析

1、队头任务1是否为队列(1,2,3,4)中优先级最高的? 否,移动到队列末。此时队列为:2 3 4 1,时刻为0

2、队头任务2是否为队列(2,3,4,1)中优先级最高的? 否,移动到队列末。此时队列为:3 4 1 2,时刻为0

3、队头任务3是否为队列(3,4,1,2)中优先级最高的? 否,移动到队列末。此时队列为:4 1 2 3,时刻为0

4、队头任务4是否为队列(4,1,2,3)中优先级最高的? 是,打印任务4。此时队列变为:1 2 3,时刻从0变为1

5、队头任务1是否为队列(1,2,3)中优先级最高的? 否,移动到队列末。此时队列为:2 3 1,时刻为1

6、队头任务2是否为队列(2,3,1)中优先级最高的? 否,移动到队列末。此时队列为:3 1 2,时刻为1

7、队头任务3是否为队列(3,1,2)中优先级最高的? 是,打印任务3。时刻从1变为2。

结束判断,输出2。

明白了题意,接下来考虑思路:

思路:

最初的思路:

将m1个任务存入队列,找到队列中最大的优先级Max。 出队,若此任务优先级<Max,则入队(队尾)。

若等于,且不是我们关注的任务:出队,T++。

若等于,且是我们关注的任务,T++,输出T。结束循环。

在实施操作中发现了以下几个难点:

难点1:如何判断打印的任务是我们关注的任务?

解决办法:将每个优先级都+10000,若为标记任务的优先级,加20000。优先级间相互判断前做一下

取余。如:10005%10000 = 20005%10000。这种方法叫做自定义标记法

难点2:最初的想法是在输入时用Max变量存储优先级最高的任务, 但如果该任务被打印,Max变

动,该怎样找到当前队列中优先级最高的任务?

解决办法:降序优先队列(priority_queueMax)存储优先级,每当优先级最高任务被打印,就出

队一次。

最终的思路

将m1个任务的优先级做标记后存入队列q(queueq),将不做标记的优先级存入降序优先队列

Max(priority_queueMax)。q出队,若优先级%10000<Max.top(),则入队(队尾), 若优先

级%10000=Max.top(),且<20000,q出队,Max出队,T++; 若>20000,则输出T,结束循环。

#include<bits/stdc++.h>
using namespace std;
int main() {
//freopen("in.txt", "r", stdin);
int n; cin >> n; while (n--) {
int m1, m2; cin >> m1 >> m2;
int T = 0; queue<int>q;
priority_queue<int>qq;
for (int i = 0; i < m1; ++i) {
int x; cin >> x;
qq.push(x);
i == m2 ? x += 20000 : x += 10000;
q.push(x);
}
while (1) {
int x = q.front();
q.pop();
if (x % 10000 < qq.top())q.push(x);
else {
if (x > 20000) { cout << ++T << endl; break; }
else { qq.pop(), ++T; }
}
}
}
return 0;
}

Printer Queue,UVa 12100 (自定义标记法 + 优先队列)的更多相关文章

  1. Printer Queue UVA - 12100

    The only printer in the computer science students' union is experiencing an extremely heavy workload ...

  2. 12100 Printer Queue(优先队列)

    12100 Printer Queue12 The only printer in the computer science students’ union is experiencing an ex ...

  3. uva 12100 Printer Queue

    The only printer in the computer science students' union is experiencing an extremely heavy workload ...

  4. UVa 12100 Printer Queue(queue或者vector模拟队列)

    The only printer in the computer science students' union is experiencing an extremely heavy workload ...

  5. J - Printer Queue 优先队列与队列

    来源poj3125 The only printer in the computer science students' union is experiencing an extremely heav ...

  6. Printer Queue

    Description The only printer in the computer science students' union is experiencing an extremely he ...

  7. [刷题]算法竞赛入门经典(第2版) 5-7/UVa12100 - Printer Queue

    题意:一堆文件但只有一个打印机,按优先级与排队顺序进行打印.也就是在一个可以插队的的队列里,问你何时可以打印到.至于这个插队啊,题目说"Of course, those annoying t ...

  8. Camel、Pastal、匈牙利标记法区别及联系

    在英语中,依靠单词的大小写拼写复合词的做法,叫做"骆驼拼写法"(CamelCase).比如,backColor这个复合词,color的第一个字母采用大写. 这种拼写法在正规的英语中 ...

  9. POJ 3125 Printer Queue

    题目: Description The only printer in the computer science students' union is experiencing an extremel ...

  10. 匈牙利标记法定义ECMAScript变量前缀

    匈牙利标记法定义ECMAScript变量前缀 类型 前缀 示例 数组 a aArray 布尔型 b bMale 浮点型(数字)   f fTax 函数 fn fnSwap 整型(数字) i iAge ...

随机推荐

  1. 在ASP.NET Core 中使用 .NET Aspire 消息传递组件

    前言 云原生应用程序通常需要可扩展的消息传递解决方案,以提供消息队列.主题和订阅等功能..NET Aspire 组件简化了连接到各种消息传递提供程序(例如 Azure 服务总线)的过程.在本教程中,小 ...

  2. 在路上---学习篇(一)Python 数据结构和算法 (2) -- 冒泡排序、选择排序、插入排序

    独白: 第一次接触算法排序, 充满了好奇并且渴望了解其中原理,今天先学习了三种排序的方法,分别是 冒泡排序.选择排序.插入排序.学完以后发现数学知识真的很重要,越牛逼的算法要求知识越多,越精.虽说刚接 ...

  3. vue+element-ui中引入编辑器

    wangeditor编辑器 1.执行:npm install  --save  wangeditor 2.在你需要调用编辑器的vue文件中引入 wangeditor: import E from 'w ...

  4. java集合框架(二)LinkedList的常见使用

    @[toc]## 一.什么是LinkedList LinkedList是Java中的一个双向链表. 它实现了List和Deque接口,在使用时可以像List一样使用元素索引,也可以像Deque一样使用 ...

  5. 离散傅里叶变换DFT的应用

    目录 一维DFT 1 DFT的相关内容 2 DFT计算结果验证 3 DFT的时频曲线分析 4 DFT的应用 二维DFT 1 DFT在图像处理时的相关内容 2 DFT滤波应用 一维DFT 1 DFT的相 ...

  6. kotlin+springboot入门级别教程,教你如何用kotlin和springboot搭建http

    先打开idea,或者用springboot官网.阿里云那边都行 然后点击新建项目,spring Initializr,我们都知道,springboot是支持kotlin的,除非你是kotlin1.3之 ...

  7. IP的电源管脚

    IP的电源管脚是个特殊的存在. 1.对于前度RTL集成,需要和IP vendor以及后端确认,集成与综合时是否需要将电源DVDD,AVDD,引出到top层. 2.绝大部分情况下IP的电源PIN是sup ...

  8. 2023-12-20:用go语言,给定一个数组arr,长度为n,在其中要选两个不相交的子数组。 两个子数组的累加和都要是T,返回所有满足情况中,两个子数组长度之和最小是多少? 如果没有有效方法,返回-

    2023-12-20:用go语言,给定一个数组arr,长度为n,在其中要选两个不相交的子数组. 两个子数组的累加和都要是T,返回所有满足情况中,两个子数组长度之和最小是多少? 如果没有有效方法,返回- ...

  9. python tkinter 使用(八)

    python tkinter 使用(八) 本文主要讲下tkinter库中的其他的一些模块,如simpleDialog,scrollerText等. 1: simpleDialog simpledial ...

  10. 安装Office

    安装Office 第一步 访问: https://otp.landian.vip/zh-cn/ 点击立即下载 选择: 第二步 打开下载好的zip,解压,启动程序 第三步 选择部署(在这里可以看到电脑已 ...