[洛谷]SP1840

题目

PQUEUE - Printer Queue 学生会里只有一台打印机,但是有很多文件需要打印,因此打印任务不可避免地需要等待。有些打印任务比较急,有些不那么急,所以每个任务都有一个1~9间的优先级,优先级越高表示任务越急。打印机的运作方式如下:首先从打印队列里取出一个任务J,如果队列里有比J更急的任务,则直接把J放到打印队列尾部,否则打印任务J(此时不会把它放回打印队列)。 输入打印队列中各个任务的优先级以及所关注的任务在队列中的位置(队首位置为0),输出该任务完成的时刻。所有任务都需要1分钟打印。例如,打印队列为{1,1,9,1,1,1},目前处于队首的任务最终完成时刻为5。输入T 接下来T组数据 每组数据输入N,TOP。接下来N个数,TOP代表队列首

#include <bits/stdc++.h>
#define INT32_MAX 2147483647
using namespace std;

int solve() {
    int n, m, ans = 0, backup;
    cin >> n >> m;
    queue<int> q;
    priority_queue<int> pmax;
    for (int tmp, i = 0; n--; ++i) {
        cin >> tmp;
        if (i == m) {
            q.push(INT32_MAX);
            backup = tmp;
        } else {
            q.push(tmp);
        }
        pmax.push(tmp);
    }
    while (not q.empty() and not(q.front() == INT32_MAX and backup == pmax.top())) {
        if (pmax.top() == q.front()) {
            pmax.pop();
            q.pop();
            ans++;
        } else {
            q.push(q.front());
            q.pop();
        }
    }
    return ans+1;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin>>t;
    queue<int> q;
    while(t--){
        q.push(solve());
    }
    while(!q.empty()){
        cout<<q.front()<<endl;
        q.pop();
    }
    return 0;
}
posted @ 2024-03-08 20:39  (ToT)  阅读(21)  评论(0)    收藏  举报