题目描述

我们需要用打印机打印任务。每个任务都有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. PX4安装环境测试

    1.ROS环境测试 安装ROS版本:melodic roscore // 注意下面是打开一个新的终端,roscore一直在运行 rosrun turtlesim turtlesim_node // 再 ...

  2. TIOBE 12月榜单: C# 即将成为2023 年度编程语言

    TIOBE 公布了 2023 年 12 月的编程语言排行榜. 2022年C# 在挑战成为年度编程语言,但在最后一刻,C++出人意料地夺得了冠军.今年,我们确信 C# 将获胜成为2023年度编程语言.它 ...

  3. [QOJ1359] Setting Maps

    题目链接 \(k=1\) 的时候显然是最小割.把一个点 \(u\) 拆成 两个点,中间连流量为 \(c_u\) 的边. 那么考虑扩展到 \(k\) 更大的情况.把上图的每个入点和出点都拆成 \(k\) ...

  4. [HAOI2018] 字串覆盖

    [HAOI2018]字串覆盖 题目描述 小C对字符串颇有研究,他觉得传统的字符串匹配太无聊了,于是他想到了这 样一个问题. 对于两个长度为n的串A, B, 小C每次会给出给出4个参数s, t, l, ...

  5. flask统一异常捕获(作用:统一捕获指定的异常并返回)

    flask中可以使用装饰器errorhandler来对指定的异常.状态码等统一捕获并处理. 对指定的状态码进行统一捕获 @app.errorhandler(404) # 参数e是异常的详细信息的对象, ...

  6. MinIO客户端之mv

    MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc mv 将对象在桶之间移动. 在桶内准备好待移动的文件,检查对象,命令如下: ./mc ls local1/b ...

  7. Triple DES 加密解密技术解析

    摘要:本文介绍了Triple DES加密解密技术,通过实例演示了加密和解密过程,并对算法原理进行了简要分析.同时,探讨了Triple DES在现代信息安全领域的应用和局限性. 3DES(Triple ...

  8. flutter常用的音乐播放器库

    audioplayers: 优势:audioplayers 是一个简单易用的音乐播放器库,支持主流平台(Android.iOS)并提供了丰富的功能,比如播放.暂停.快进.音量控制等. 缺点:audio ...

  9. Flink实时处理入门

    Flink实时处理入门 1.Flink框架介绍 Flink 诞生于欧洲的一个大数据研究项目 StratoSphere.它是由 3 所地处柏林的大学和欧洲其他一 些大学在 2010~2014 年共同进行 ...

  10. 云图说丨初识华为云OrgID:轻松实现统一帐号、统一授权

    本文分享自华为云社区<[云图说]第282期 初识华为云OrgID:轻松实现统一帐号.统一授权>,作者: 阅识风云 . 组织成员帐号 OrgID是面向企业提供组织管理.企业成员帐号管理以及S ...