题意:有一个打印机,需要打印一系列的文件,但是有紧急文件需要打印,有的不是紧急文件,所有给每个文件进行分优先级(1-9的优先级),优先级越高表示任务越急。所以打印机的操作时这样的,首先从打印队列中从头开始读取每个打印任务,如果队列中有比此时的打印任务优先级高的,就把此打印任务放到队列的尾部,然后继续读取任务,直到读取到优先级最高的任务,就开始打印。每次打印耗时为1,其他情况不消耗时间,问当打印某个特定文件(一开始会给出)时耗时多久。
题意有点不清晰,解释一下样例。
3 接下来有3组输入
1 0 代表有1个任务 求出打印完第0个任务的耗时(下标从0开始)
5 任务的优先级
4 2 代表有4个任务 求出打印完第2个任务的耗时
1 2 3 4
6 0
1 1 9 1 1 1
Sample Output
1 耗时1
2 耗时2
5
用队列模拟就可以了,一个普通队列,一个优先队列就行了,很简单。
#include <queue>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int num;
int pos;
}s[1005],pre;
int main() {
int N;
int sum;
int n, m;
scanf("%d",&N);
while(N--) {
sum = 1;
queue<node> q1;
priority_queue<int> q2;
scanf("%d %d",&n, &m);
for(int i = 0; i < n; i++) {
scanf("%d",&s[i].num);
s[i].pos = i;
q1.push(s[i]);
q2.push(s[i].num);
}
while(!q1.empty()) {
while(1) {
pre = q1.front();
if(q2.top() == pre.num) {
q2.pop();
break;
}
q1.push(q1.front());
q1.pop();
}
if(pre.pos == m) {
printf("%d\n",sum);
break;
}
else {
sum++;
q1.pop();
}
}
}
return 0;
}