题目描述

我们需要用打印机打印任务。每个任务都有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. 全屏API及vue3 hook封装

    最近在一个大屏项目遇到一个需求:用户可以通过一个按钮,触发页面部分模块全屏.通过以下API可以实现: Element.requestFullscreen()方法用于发出异步请求使元素进入全屏模式. 且 ...

  2. dbeaver软件的使用

    dbeaver软件的使用 一.dbeaver简介: dbeaver是免费和开源(GPL)为开发人员和数据库管理员通用数据库工具. DBeaver [1] 是一个通用的数据库管理工具和 SQL 客户端, ...

  3. Modbus转PROFINET网关助力电子天平与西门子PLC无缝对接

    背景: 在制药.食品科学和其他行业中,电子天平被广泛用于质量控制和分析实验.它们可以用于检测样品的净重.含量和浓度,并用于监测产品的制造过程. 常州某反应器公司实验室近期采购一批电子天平,现需要把电子 ...

  4. Hive的使用以及如何利用echarts实现可视化在前端页面展示(四)---连接idea使用echarts可视化界面

    说来惭愧,我的javaweb烂得一批,其他步骤我还是很顺利地,这个最简单的,我遇到了一系列问题.只能说,有时候失败也是一种成功吧 这一步其实就是正常的jdbc,没什么可说明的,但是关于使用echart ...

  5. going 小闫 | 学习就像典韦哥:彻底疯狂

    看了相关的Hadoop的视频,介绍部分. 刷单词 看了coco电影

  6. 【UniApp】-uni-app-网络请求

    前言 经过上个章节的介绍,大家可以了解到 uni-app-pinia存储数据的基本使用方法 那本章节来给大家介绍一下 uni-app-网络请求 的基本使用方法 步入正题 首先我们打开官方文档,我先带着 ...

  7. ElasticSearch 命令执行漏洞

    漏洞编号:CVE-2014-3120 漏洞详情 CVE编号 CVE-2014-3120 漏洞级别 中危6.8 标题 Elasticsearch默认配置允许动态脚本执行漏洞 披露时间 2014/07/2 ...

  8. u盘加密原理和实现步骤

    U盘加密原理:U盘加密的原理主要是通过对U盘存储的数据进行加密处理,确保只有经过授权的用户才能访问和解密数据.以下是一般的U盘加密原理: 加密算法: 使用强大的加密算法对U盘中的数据进行加密.常见的算 ...

  9. vulnhub - tornado - wp

    coverY: 0 tornado 信息收集 目标开放了80,22端口. 访问80网页,是默认页面: 目录枚举 用dirsearch没有什么发现,换gobuster发现了一个bluesky目录.访问如 ...

  10. Linux发行版的基础目录名称、命名法则及功能规定

    罗列Linux发行版的基础目录名称命名法则及功用规定 目录描述 /主层次 的根,也是整个文件系统层次结构的根目录 /bin存放在单用户模式可用的必要命令二进制文件,所有用户都可用,如 cat.ls.c ...