欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

打印队列 UVA 12100

程序员文章站 2022-06-02 20:30:05
...

        一开始的思路是用两个队列,一个优先队列,一个普通的队列,普通队列的首元素与优先队列的首元素比较,元素不相同的话将普通队列的首元素移至最后,时间不消耗;如果相同,打印当前内容,时间+1分钟,同时移除首元素。结果证明不可行,因为优先队列中,优先级相同的情况下,不是按照输入的先后顺序排列的。下面是代码

struct Node
{ 
	int p;
	string s;
	friend bool operator <(Node a, Node b)
	{
		return a.p< b.p;
	}
	friend bool operator==(Node a, Node b)
	{
		return a.s == b.s && a.p == b.p;
	}
	friend bool operator!=(Node a, Node b)
	{
		return a.s != b.s || a.p != b.p;
	}
};
int main()
{
priority_queue<Node> pq;
queue<Node> q;
int n = 0;
while (scanf_s("%d",&n))
{
	for (int i = 0; i < n; i++)
	{
		Node node;
		cin >> node.p >> node.s;
		pq.push(node);
		q.push(node);
		
	}
	int minute = 1;
	while (q.size()!=0)
	{
		// 首元素不同
		while (q.front()!=pq.top())
		{
			q.push(q.front());
			q.pop();
		}
		cout << minute << "分钟打印当前内容" << q.front().s << endl;
		minute++;
		q.pop();
		pq.pop();
	}
}
	return 0;
}


打印队列 UVA 12100


        不能直接比较元素两个队列的元素是否相同,而是应该直接比较优先级是否相同。稍作修改,可以将上面元素是否形同换成优先级是否相同,我是将优先队列换成vector

struct Node
{ 
	int p;
	string s;
	friend bool operator <(Node a, Node b)
	{
		return a.p> b.p;        //注意这里和上面的不同
	}
	friend bool operator==(Node a, Node b)
	{
		return a.s == b.s && a.p == b.p;
	}
	friend bool operator!=(Node a, Node b)
	{
		return a.s != b.s || a.p != b.p;
	}
};
int main()
{
vector<Node> vec;
queue<Node> q;
int n = 0;
while (scanf_s("%d",&n))
{
	for (int i = 0; i < n; i++)
	{
		Node node;
		cin >> node.p >> node.s;
		vec.push_back(node);
		q.push(node);
		
	}

	sort(vec.begin(), vec.end());
	int minute = 1;
	int index_sort = 0;
	while (q.size())  //队列元素清空为止
	{
		while (q.front().p < vec[index_sort].p) //队列元素优先级小于数组当前优先级
		{									//将队列首元素移动至队列末端	
			q.push(q.front());
			q.pop();
		}
		cout <<minute<<"分钟打印当前内容:" <<q.front().s << endl;
		minute++;
		index_sort++;
		q.pop();
	}
}
	return 0;
}

打印队列 UVA 12100