zoukankan      html  css  js  c++  java
  • 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,时刻为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;
    }
    
  • 相关阅读:
    【Selenium-WebDriver实战篇】java测试使用HttpClient debug日志关闭
    【Selenium-WebDriver实战篇】selenium之使用Tess4J进行验证码图片识别内容
    【Selenium-WebDriver实战篇】基于java的selenium之验证码识别内容
    【自动化测试网址】相关学习网址和定期更新(更新中...)
    【Selenium-WebDriver实战篇】ScreenRecorder的实际输出路径,自己的解决方案
    【Selenium-WebDriver实战篇】ScreenRecorder的实际输出路径设置(转)
    【Selenium-WebDriver实战篇】Eclipse上的maven使用JsonObject时,添加依赖后无法自动下载相应的jar包
    【AirTest自学】AirTest工具介绍和入门学习(一)
    【测试面试】人脸识别的测试重点
    selenium中隐式等待和显示等待的区别
  • 原文地址:https://www.cnblogs.com/RioTian/p/13053543.html
Copyright © 2011-2022 走看看