打印队列 UVA 12100

        一开始的思路是用两个队列,一个优先队列,一个普通的队列,普通队列的首元素与优先队列的首元素比较,元素不相同的话将普通队列的首元素移至最后,时间不消耗;如果相同,打印当前内容,时间+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;
}




        不能直接比较元素两个队列的元素是否相同,而是应该直接比较优先级是否相同。稍作修改,可以将上面元素是否形同换成优先级是否相同,我是将优先队列换成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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章