Printer Queue,UVa 12100 (自定义标记法 + 优先队列)
题目描述:
我们需要用打印机打印任务。每个任务都有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,时刻为02、队头任务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 (自定义标记法 + 优先队列)的更多相关文章
- Printer Queue UVA - 12100
The only printer in the computer science students' union is experiencing an extremely heavy workload ...
- 12100 Printer Queue(优先队列)
12100 Printer Queue12 The only printer in the computer science students’ union is experiencing an ex ...
- uva 12100 Printer Queue
The only printer in the computer science students' union is experiencing an extremely heavy workload ...
- UVa 12100 Printer Queue(queue或者vector模拟队列)
The only printer in the computer science students' union is experiencing an extremely heavy workload ...
- J - Printer Queue 优先队列与队列
来源poj3125 The only printer in the computer science students' union is experiencing an extremely heav ...
- Printer Queue
Description The only printer in the computer science students' union is experiencing an extremely he ...
- [刷题]算法竞赛入门经典(第2版) 5-7/UVa12100 - Printer Queue
题意:一堆文件但只有一个打印机,按优先级与排队顺序进行打印.也就是在一个可以插队的的队列里,问你何时可以打印到.至于这个插队啊,题目说"Of course, those annoying t ...
- Camel、Pastal、匈牙利标记法区别及联系
在英语中,依靠单词的大小写拼写复合词的做法,叫做"骆驼拼写法"(CamelCase).比如,backColor这个复合词,color的第一个字母采用大写. 这种拼写法在正规的英语中 ...
- POJ 3125 Printer Queue
题目: Description The only printer in the computer science students' union is experiencing an extremel ...
- 匈牙利标记法定义ECMAScript变量前缀
匈牙利标记法定义ECMAScript变量前缀 类型 前缀 示例 数组 a aArray 布尔型 b bMale 浮点型(数字) f fTax 函数 fn fnSwap 整型(数字) i iAge ...
随机推荐
- 如何通过C++ 给PDF文档添加文字水印
因PDF文档具有较好的稳定性和兼容性,现在越来越多的合同.研究论文.报告等都采用PDF格式.为了进一步保护这些重要文档内容免受未经授权的复制或使用,我们可以添加水印以表明其状态.所有权或用途.针对工作 ...
- Netty源码学习7——netty是如何发送数据的
零丶引入 系列文章目录和关于我 经过<Netty源码学习4--服务端是处理新连接的&netty的reactor模式和<Netty源码学习5--服务端是如何读取数据的>,我们了 ...
- 使用 anasible 搭建一个多 master 多 worker 的 k8s 集群
使用 ansible 搭建一个多 master 多 worker 的 k8s 集群 kubernetes + istio 是目前最强大,也是最易于使用的服务网格方案.要使用kubernetes + i ...
- 如何优雅而不损失性能的实现SpringCloud Gateway网关参数加解密方案
背景 为了增强产品安全性,计划对应用网关进行改造,主要是出入参经过网关时需要进行加解密操作,保证请求数据在网络传输过程中不会泄露或篡改. 考虑到密钥的安全性,每个用户登录都会签发独立的密钥对.同时摒弃 ...
- [2020-2021 集训队作业] Tom & Jerry
题目背景 自选题 by ix35 题目描述 给定一张包含 \(n\) 个顶点和 \(m\) 条边的 无向连通图,Tom 和 Jerry 在图上进行了 \(q\) 次追逐游戏. 在第 \(i\) 次游戏 ...
- 设备唯一标识方法(Unique Identifier):如何在 Windows 系统上获取设备的唯一标识
原文地址 设备唯一标识方法(Unique Identifier):如何在 Windows 系统上获取设备的唯一标识 zz 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保证 ...
- GZY.Quartz.MUI(基于Quartz的UI可视化操作组件) 2.6.0发布 兼容.Net8.0
前言 为了迎接.Net8.0 2.6.0终于发布了~ 更新内容: 兼容.NET8.0 新增界面按分组名称排序功能 优化本地持久化时文件路径异常的问题 优化数据库持久化时偶现的异常问题 新增简易授权,增 ...
- AI换脸利器!Roop下载分享
前段时间给大家介绍过换脸界最强的Rope,感兴趣的小伙伴可以戳戳手指 传送门:https://blog.csdn.net/S_eashell?spm=1011.2415.3001.5343 今天要 ...
- ElasticSearch-document文档数据-增删改
文档就是相当于每条记录. 每个文档(数据记录行)都有几个元数据,分别是: _index,表示该文档是那个索引中的. _type,表示文档的类型 _id,文档的唯一ID编号 _score,相关性分数. ...
- C++ Qt开发:Charts绘制各类图表详解
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TreeWid ...