紫书刷题记录 UVa12100 打印队列

看了很多题解用了优先队列,那我这里就用容器+队列。
这道题的难点就在于位置的判断,因为优先级是会重复的,队列的位置是不如容器那样好索引的,所以很自然的想到建立一个打印任务的结构体,储存优先级和位置;但问题来了,我们知道队列是不支持随机访问元素的,只能访问头部,那么确定最高的优先级呢?很简单,用一个vector,入队的时候储存优先级,这个vector不需要和队列的位置对应,入队完成后按降序排列,此时vector的第一个元素就是优先级最高的。
剩下的就很容易了,依次判断队首的优先级和最高优先级,如果队首优先级小于最高优先级,插入队尾,队首出队。下面上代码:

#include
#include
#include
#include
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;
}

你可能感兴趣的:(紫书刷题记录,c++,算法)