UVA12100 打印队列 Printer Queue

简介: UVA12100 打印队列 Printer Queue

题意描述


学生会里只有一台打印机,但是有很多文件需要打印,因此打印任务不可避免地需要等待。有些打印任务比较急,有些不那么急,所以每个任务都有一个1~9间的优先级,优先级越高表示任务越急。


打印机的运作方式如下:首先从打印队列里取出一个任务J,如果队列里有比J更急的任务,则直接把J放到打印队列尾部,否则打印任务J(此时不会把它放回打印队列)。 输入打印队列中各个任务的优先级以及所关注的任务在队列中的位置(队首位置为0),输出该任务完成的时刻。所有任务都需要1分钟打印。例如,打印队列为{1,1,9,1,1,1},目前处于队首的任务最终完成时刻为5。


输入T 接下来T组数据 每组数据输入N,TOP。接下来N个数,TOP代表队列首


输入


3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1

输出

1
2
5


思路:


思路一: 1.初始化:首先可以搞一个结构体来存储数据的起始位置和优先级,然后把这些节点放到队列中,同时用一个数组来存放优先级.

2. 然后开始进行处理:先对优先级数组进行排序.然后每次从队列中获取对头元素判断优先级是否小于优先级队列中标记处的优先级,如果小于则直接放到队列尾部,处理下一个;如果等于且不是要查找的元素,则执行该任务,计时.如果优先级等于优先级数组中标记处的优先级且是自己所关注的任务,则执行该任务,然后结束.


思路二: 本题也可利用两个数组和一个队列来完成,一个数组来当做优先级数组,另外一个存储原始数据,然后队列来存储对应数据的索引(也就是用索引来指代数据),然后也是从前往后进行判断,判断时索引也就是位置.可以通过数组获取其优先级,然后与其优先数组进行比较…思路和上面差不多.


代码1

#include<bits/stdc++.h>
using namespace std;
struct Q {
  int v;//优先级 
  int x;//记录位置. 
  Q(int a = 0, int b = 0) :v(a), x(b) {};//构造方法进行初始化 
};
vector<int> prior;//存放优先级 
int n, m, w, val, k, total;//k:用于prior中索引,total用于计算时间 
queue<Q> que;
int main()
{
  cin >> n;
  while (n--) {
    while (!que.empty()) {
      que.pop();
    }
    prior.clear();
    k = 0;
    total = 0;
    cin >> m >> w;
    for (int i = 0; i < m; i++) {//初始化队列 
      cin >> val;
      prior.push_back(val);
      que.push(Q(val, i));
    }
    sort(prior.begin(), prior.end(), greater<int>());
    while (que.size() > 0) {
      if (que.front().v == prior[k]) {
        if (que.front().x == w) {
          total++;
          break;
        }
        else {
          que.pop();
          total++;
          k++;
        }
      }
      else {
        que.push(que.front());
        que.pop();
      }
    }
    cout << total << endl;
  }
  return 0;
}

代码2

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
int main()
{
  int t, n, top;
  cin >> t;
  while(t--)//t组测试
  {
    int num;
    queue<int> q;
    vector<int> v1,v2;
    cin >> n >> top;
    for (int i = 0; i < n; i++)//每组测试数据初始化
    {
      cin >> num;
      q.push(i);
      v1.push_back(num);
      v2.push_back(num);
    }
    int w = 0, cur,k=0;
    sort(v2.begin(), v2.end(), greater<int>());//降序
    while (!q.empty())
    {
      cur = q.front();
      //1.取出队列中对头任务判断是否是最紧急的,如果不是就放在最后;
      //2.如果是最高的,就打印并判断是否是自己打印的那个文件   这个题不能用一个数组和一个队列写,因为优先级可能有多个相同的.这样没法区分,应该再搞一个数组,通过索引进行区分.
      //3.如果不是自己打印的文件但优先级最高则打印并计时然后继续判断,如果是则计时并结束\.
      if (v1[cur] == v2[w])//判断当前是不是最紧急的 
      {
        if (cur == top)
        {
          k++;//计时
          break;
        }
        else {
          q.pop();
          w++;//优先级索引后移
          k++;
        }
      }
      else {//不是最高优先级,放到队列最后
        q.pop();
        q.push(cur);
      }
    }
    cout << k << endl;
  }
}
相关文章
|
11天前
|
机器学习/深度学习 存储 测试技术
[C++/PTA] 队列操作
[C++/PTA] 队列操作
26 0
|
9月前
uva133 The Dole Queue
uva133 The Dole Queue
44 0
|
机器学习/深度学习 测试技术 C++
C++/PTA 队列操作
请实现一个MyQueue类,实现出队,入队,求队列长度.
105 0
|
C++
【学习笔记】C++ stack和queue题目练习
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack(),初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部的元素。 int top() 获取堆栈顶部的元素。 int getMin() 获取堆栈中的最小元素。
115 0
|
存储 C++ 容器
【C++初阶学习】stack/queue/priority_queue的使用和模拟(3)
【C++初阶学习】stack/queue/priority_queue的使用和模拟(3)
【C++初阶学习】stack/queue/priority_queue的使用和模拟(3)
|
设计模式 存储 算法
【C++初阶学习】stack/queue/priority_queue的使用和模拟(2)
【C++初阶学习】stack/queue/priority_queue的使用和模拟(2)
【C++初阶学习】stack/queue/priority_queue的使用和模拟(2)
|
C++ 容器
【C++初阶学习】stack/queue/priority_queue的使用和模拟(1)
【C++初阶学习】stack/queue/priority_queue的使用和模拟(1)
【C++初阶学习】stack/queue/priority_queue的使用和模拟(1)
LeetCode 225:用队列实现栈 Implement Stack using Queues
题目: 使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 Implement the following operations of a stack using queues.
1047 0
LeetCode 232:用栈实现队列 Implement Queue using Stacks
题目: 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。
648 0