看了很多题解用了优先队列,那我这里就用容器+队列。
这道题的难点就在于位置的判断,因为优先级是会重复的,队列的位置是不如容器那样好索引的,所以很自然的想到建立一个打印任务的结构体,储存优先级和位置;但问题来了,我们知道队列是不支持随机访问元素的,只能访问头部,那么确定最高的优先级呢?很简单,用一个vector,入队的时候储存优先级,这个vector不需要和队列的位置对应,入队完成后按降序排列,此时vector的第一个元素就是优先级最高的。
剩下的就很容易了,依次判断队首的优先级和最高优先级,如果队首优先级小于最高优先级,插入队尾,队首出队。下面上代码:
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
struct Node//打印任务
{
int pos;//位置
int priority;//优先级;
};
int main()
{
int t;
cin>>t;
while(t--)
{
queue<Node>q;
vector<int>v;//储存优先级;
int n,pos;//队列长度,关注位置;
cin>>n>>pos;
int p;
for(int i=0;i<n;i++)
{
cin>>p;
Node node;
node.pos=i;
node.priority=p;
q.push(node);
v.push_back(p);
}
sort(v.begin(),v.end(),greater<int>());//找优先级最大的,这里是降序排列;
int s=0;//计数;
while(1)
{
int Max=v[0];
while(q.front().priority<Max)
{
q.push(q.front());//模拟题目,队首到队尾;
q.pop();
}
if(q.front().pos==pos)//判定;
{
s++;
break;
}
q.pop();
v.erase(v.begin());//删除头部,更新Max;
s++;
}
cout<<s<<endl;
}
return 0;
}