题意:给出队列n个数的优先级和他的位置,每次输出的必须是队列中优先级最高的数,否则就要插入队尾,给定位置的数要输出,求之前输出几个数(和它本身)?
思路:开一个优先队列(其实一个大头的堆也可以)和一般存数的队列。模拟之。和之前的写过的一篇排队要看病列类似。
代码:
#include <iostream>
#include <set>
#include <string>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
struct Node
{
int num;
int prio;
};
int n,k;
struct cmp
{
bool operator()(Node &a,Node &b)
{
if(a.prio<b.prio)
return true ;
else
return false;
}
};
priority_queue<Node ,vector<Node>,cmp>tmp;
queue<Node>Q;
int main()
{
int p;
int num;
int sum=0;
Node newt,t;
int cas;
cin>>cas;
while(cas--)
{
while(!tmp.empty())tmp.pop();
while(!Q.empty())Q.pop();
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>num;
newt.prio=num;
newt.num=i;
tmp.push(newt);
Q.push(newt);
}
sum=0;
while(1)
{
t=tmp.top();
newt=Q.front();
if(newt.num==k&&newt.prio>=t.prio)
{
//cout<<k<<endl;
sum++;break;
}
else if(newt.prio>=t.prio&&newt.num!=k)
{
//cout<<newt.num<<endl;
sum++;
tmp.pop();
Q.pop();
}
else
{
Q.pop();
Q.push(newt);
}
}
cout<<sum<<endl;
}
return 0;
}