【算法分析】
设结构体类型Person表示一个患者,包含属性:名字,病情优先级。
设优先队列(堆),里面保存Person类型的对象,优先级定义为:病情优先级高的人更优先。
输入数据,遇到push时,生成一个患者,加入优先队列。遇到pop时,取优先队列的队头(堆顶),而后出队(删除堆顶)。如果优先队列为空,输出none。
添加和删除的患者数量达到10^5,如果使用优先队列(堆),那么添加、删除的复杂度都是O(logn),整体复杂度为 O(nlogn),是可行的。
【参考代码】
#include<bits/stdc++.h>
using namespace std;
struct Person
{
char name[25];
int level;
bool operator < (const Person &b) const //这一行定义了一个比较运算符 < 的重载。这个函数允许在两个 Person 对象之间进行比较,以确定它们之间的大小关系。
{
return b.level > level; //病情等级更高的更优先
}
};
int main()
{
Person per;
int n;
char s[25];
scanf("%d", &n);
priority_queue<Person> pq;//大顶堆
for(int i = 1; i <= n; ++i)
{
scanf("%s", s);
if(strcmp(s, "push") == 0)
{
scanf("%s%d", per.name, &per.level);
pq.push(per);
}
else//pop
{
if(pq.empty())
printf("none\n");
else
{
per = pq.top();
printf("%s %d\n", per.name, per.level);
pq.pop();
}
}
}
return 0;
}