打印隊列 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;
}


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