
優先隊列
頭檔案:#include<queue>
初始化:priority_queue<類型type,容器vector<type>,比較方式less<type>/greater<type> >q;
簡寫:priority_queue<type>q;預設大頂堆
入隊:q.push()
出隊:q.pop()
取首:q.top() 注意:隊列是q.front()
判空:q.empty()
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<vector>
#include<string.h>
#include<queue>
using namespace std;
typedef struct person{
char name[22];
int rp;
}per;
struct cmp //struct{};
{
bool operator()(per a,per b) //bool operator()( , )
{
if(a.rp==b.rp)
return strcmp(a.name,b.name)<0; //字母從Z到A,ASCII碼從大到小,後字決定
else
return a.rp>b.rp; //人品值從小到大排序,後字決定
}
}; //優先隊列,後字決定,sort排序,前字訣定
int main()
{
int i,m,n,num,num1;
char v[50];
per s;
while(~scanf("%d%d",&n,&m))
{
priority_queue<per,vector<per>,cmp>q[10050]; //初始化放在循環内部,每組樣例前都要初始化。優先隊列自動排序
for(i=1;i<=n;i++) //n列車
{
scanf("%d",&num); //該列車有num個人
while(num--){
scanf("%s%d",s.name,&s.rp); //每個人的姓名,人品值
q[i].push(s);
}
}
while(m--) //m個操作
{
scanf("%s",v);
if(strcmp(v,"GETON")==0)
{
scanf("%d%s%d",&num,s.name,&s.rp);
q[num].push(s);
}
if(strcmp(v,"JOIN")==0)
{
scanf("%d%d",&num,&num1);
while(q[num1].empty()!=1){
s=q[num1].top();
q[num].push(s);
q[num1].pop();
}
}
if(strcmp(v,"GETOUT")==0)
{
scanf("%d",&num);
s=q[num].top();
printf("%s\n",s.name);
q[num].pop();
}
}
}
return 0;
}