励志用尽量少的代码做高效的表达。


题目(提交)链接→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,时刻为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_queue<int>Max)存储优先级,每当优先级最高任务被打印,就出队一次。
最终的思路:
将m1个任务的优先级做标记后存入队列q(queue<int>q),将不做标记的优先级存入降序优先队列Max(priority_queue<int>Max)。q出队,若优先级%10000<Max.top(),则入队(队尾), 若优先级%10000=Max.top(),且<20000,q出队,Max出队,T++; 若>20000,则输出T,结束循环。

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int n;  cin >> n; while(n--) {int m1, m2; cin >> m1 >> m2;            //任务数和关注的任务所在位置int T = 0;                              //队列中最大的优先级、时刻 queue<int>q;                           //主队列 priority_queue<int>Max;                 //降序优先队列,存储优先级 for(int i = 0; i < m1; i++)  { int x; cin>>x; Max.push(x);                       //压入优先级(Max 中是原本优先级的数)i == m2 ? x+=20000 : x+= 10000;     //将关注任务的优先级做标记 q.push(x);                           //任务入队 }while(1) {int x = q.front(); q.pop();if((x%10000) < Max.top()) { q.push(x); }                       //若不是当前最高优先级,则回队尾 else   if(x >= 20000) { T++; cout << T << endl; break;}          //若是,且为关注的任务,则输出,结束循环。 else { Max.pop(); T++; }                                  //若不是关注的任务,则T++, Max出队,q出队,T++         }} return 0;
}

收获:

1、才知道队列是没有迭代器的。(不要笑话我o(╯□╰)o)
2、自定义标记法做标记


择苦而安,择做而乐,虚拟现实终究比不过真实精彩之万一。

25行代码AC——习题5-7 打印队列(Printer Queue,UVa 12100)——解题报告相关推荐

  1. 16行代码AC——例题6-4破损的键盘(Broken Keyboard,UVa 11988)——解题报告

    励志用尽量少的代码做高效的表达. 题目(提交)链接→UVa-11988 题目大意: 输入一个字符串,输出在原本应该是怎么样的? 具体方法是: 若读取到'[', 则执行Home键:将光标移到行首. 若读 ...

  2. 11行代码AC——习题2-4 子序列的和(subsequence)——解题报告

    励志用尽量少的代码做高效的表达. 题目描述: 输入两个正整数n<m<106,输出1/(n²)+1/((n+1)²)+--+1/(m²),保留5位小数.输入包含多组数据,结束标记为n=m=0 ...

  3. 比紫书优化,14行代码AC——例题 5-7 丑数(Ugly Numbers,UVa 136)——解题报告

    题意: 丑数是一些因子只有2,3,5的数.数列1,2,3,4,5,6,8,9,10,12,15--写出了从小到大的前11个丑数,1属于丑数.现在请你编写程序,找出第1500个丑数是什么. 没有输入 输 ...

  4. 31行代码AC——PTA 求二叉树的叶子结点个数 (20分)——解题报告

    励志用尽量少的代码做高效的表达. 以二叉链表作为二叉树的存储结构,求二叉树的叶子结点个数. 输入格式: 输入二叉树的先序序列. 提示:一棵二叉树的先序序列是一个字符串,若字符是'#',表示该二叉树是空 ...

  5. 21行代码AC——习题5-1 代码对齐(Alignment of Code, UVa1593)——解题报告

    题意: 输入若干行代码,要求各列单词的左边界对齐且尽量靠左,单词之间至少要空一格,每个单词不超过80个字符,每行不超过180个字符,一共最多1000行. 思路: 1.输入内容存入二维数组 2.找出每列 ...

  6. (~解题报告~)L1-020 帅到没朋友 (20分)——25行代码AC

    立志用更少的代码做更高效的表达 当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友.本题就要求你找出那些帅到没有朋友的人. 输入格式: 输入第一行给出一个正整数N(≤100),是已知朋 ...

  7. 28行代码AC——习题3-12 浮点数(UVA 11809 - Floating-Point Numbers)——解题报告

    励志用少的代码做高效的表达 题目(提交)链接→UVA-11809 算是个数学题吧,虽然在AOAPC上面给放到象征水题的第三章里面了. 这个题基本就是帮着你复习了一遍浮点数的存储方式了.浮点数在计算机里 ...

  8. 21行代码AC——习题3-7 DNA序列(UVa-1368)_解题报告

    励志用尽量少的代码做高效表达. 题目(提交)链接→UVa-1368 思路: DNA序列:按列遍历,记录每一列出现次数最多(若同样多,则字典序最小)的字母,录入s串累加. 距离:重新遍历,录入出现次数比 ...

  9. 22行代码AC——习题5-6 对称轴(Symmetry,UVa1595)——解题报告

    励志用尽量少的代码做高效的表达. 题目(提交)链接→UVa-1595 思路: 此题本质是一道笛卡尔坐标系上的对称性问题. 判定性问题:由于只要能判别图像是否左右对称即可,无需确认关于哪条垂直线对称,那 ...

最新文章

  1. java中表示根号三_Java命名规范
  2. Angularjs controller之间的通信
  3. mysql2014安装文档_hive安装文档
  4. Shell脚本实现SSH免密登录及批量配置管理
  5. 《深入理解java虚拟机》 - 需要一本书来融汇贯通你的经验(下)
  6. php开启ziparchive类,php压缩解压文件ZipArchive类的方法使用教程
  7. python下载网页上的pdf文件_利用Python把网页内容转换为pdf格式文件,批量下载到本地!...
  8. 安装vs2015 、如何创建MFC项目
  9. 华为Mate 20X电路图纸
  10. ubuntu14.04安装skype4.3
  11. 汉诺塔_-Chaz-_新浪博客
  12. linux文件解压与压缩命令
  13. 扇贝python骗局_北斗揭獐子岛扇贝骗局:27条采捕船数万航行数据还原轨迹
  14. C语言编程>第十六周 ⑦ s是全部由小写字母字符和空格字符组成的字符串,由len传入字符串的长度,请补充fun函数,该函数的功能是:统计字符串s中的单词数,结果由变量len传回。
  15. 经典卷积神经网络-AlexNet
  16. 计算机病毒查杀功能软件有哪些,计算机病毒查杀方法
  17. 足球数据API接口 - 【即时指数2】API调用示例代码
  18. android生命周期home键,Android横竖屏切换, 手机锁屏以及按Home键和返回键时的Activity的生命周期...
  19. 【转】机器学习和神经科学:你的大脑也在进行深度学习吗?
  20. Drupal theme-2 安装主题

热门文章

  1. 第11讲:Reqeusts + PyQuery + PyMongo 基本案例实战
  2. Python中hasattr() getattr() setattr() 函数的使用
  3. python之闭包的实现
  4. MySQL大表优化技术要点科普
  5. 2020 JVM生态报告
  6. sun.misc.Unsafe操作手册
  7. 我的 2021 年终总结
  8. QUIC的前世今生——HTTP演变史
  9. Hadoop之企业案例分析
  10. IJCAI2019报告:基于无监督学习和图学习的大数据挖掘