poj 3325(模拟)

题意:给出队列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;
}

你可能感兴趣的:(ini)