一開始的思路是用兩個隊列,一個優先隊列,一個普通的隊列,普通隊列的首元素與優先隊列的首元素比較,元素不相同的話將普通隊列的首元素移至最後,時間不消耗;如果相同,打印當前內容,時間+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;
}