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