题目描述

我们需要用打印机打印任务。每个任务都有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. 什么是oa软件?oa软件能做什么?

    什么是OA软件? OA软件是办公自动化软件(Office Automation Software)的简称,是一种通过计算机技术,对办公业务流程进行管理和自动化处理的软件系统.它主要用于协调和管理企业内 ...

  2. C++ 共享内存ShellCode跨进程传输

    在计算机安全领域,ShellCode是一段用于利用系统漏洞或执行特定任务的机器码.为了增加攻击的难度,研究人员经常探索新的传递ShellCode的方式.本文介绍了一种使用共享内存的方法,通过该方法,两 ...

  3. 用最清爽的方式开发dotNet

    用最清爽的方式开发dotNet 不管是官方自带模板还是其他开源搞的,总是一来一大堆,如果你也嫌弃这些过于臃肿,不如看看我这个方式 前提 假设我要做一个简单的api 方式 想到清爽,那肯定是简单方便,脑 ...

  4. java制作游戏,如何使用libgdx,入门级别教学

    第一步,进入libgdx的官网.点击get started 进入这个页面,点击setup a project 进入这个页面直接点击,Generate a project. 点击下载,下载创建工具 它会 ...

  5. 如何将Swagger接口导入ApiFox

    先按照如下图操作 在apifox创建一个新项目,点击项目 点击导入数据(可以选择手动或者自动) 复制刚才的url,然后立即导入,保存

  6. 【UniApp】-uni-app-CompositionAPI传递数据

    前言 好,经过上个章节的介绍完毕之后,了解了一下 uni-app-传递数据 那么了解完了uni-app-传递数据之后,这篇文章来给大家介绍一下 uni-app-CompositionAPI传递数据 首 ...

  7. Cisco 交换机利用CDP数据自动绘制网络拓扑图[drawio]-实践

    进行网络运维,必须对网络拓扑情况进行详细的掌握,但是网络改动后,更新网络拓扑比较繁琐,维护人员容易懈怠,久而久之,通过人工绘制的网络拓扑很容易与现有网络出现偏差. 现在,可以通过python 丰富的库 ...

  8. C 语言教程:条件和 if...else 语句

    C 语言中的条件和 if...else 语句 您已经学习过 C 语言支持数学中的常见逻辑条件: 小于:a < b 小于或等于:a <= b 大于:a > b 大于或等于:a > ...

  9. 在k8s中快速搭建基于Prometheus监控系统

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享 前言 K8s本身不包含内置的监控工具,所以市场上有不少这样监控工具来填补这一空白,但是没有一个监控工具有prometheus ...

  10. uniapp的app苹果应用商店上架最简教程

    除了测试版本之外,uniapp打包好的ipa文件是无法直接安装在普通用户的手机上面,这是苹果的证书和描述文件的机制的原因. 因此我们需要将打包好的ipa文件上架到苹果应用商店,也就是app store ...