优先队列问题 get it !!

Posted 不搞事情和咸鱼有什么区别

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优先队列问题 get it !!相关的知识,希望对你有一定的参考价值。

首先 队列的基本用法

头文件 #include<queue>

priority_queue < int/string/struct> q//  q为队列的名字

基本操作

q.push() 入队 (入队可以将整个结构体中的数据直接入队,后面的pop,top 都是如此)

q.top()  返回队首元素

q.pop()  清除队首元素

q.empty() 如果队列是空 则返回1


以杭电1434为例

 

Problem Description
一批幸福的列车即将从杭州驶向幸福的终点站——温州,身为总列车长的linle有一些奇怪的癖好。

他会记录下全部乘客的名字(name)和他们的人品值(RP),根据这些将他们排序,并不时地从某辆列车里踢出人品最不好(RP值最低)的一个人,当两个人人品一样不好时,他就会踢出名字难听的人(linle认为按字典顺序,排在越在后面的人名字越难听)。

当然出于列车行驶需要,他还会不时的发布一些命令,比如让某个乘客上车,合并某两辆列车等。

linle的上一任秘书***因为不能高效地执行他的这些命令而被炒鱿鱼,他现在正在寻觅新的秘书人选,你能不能胜任呢?(谢绝男士,待遇丰厚~~~)
 

 

Input
本题包含多组测试,请处理到文件结束。
对于每一组测试,第一行包含两个整数 N ,M ,表示一共有N( N<=10000 ) 辆列车,执行M( M<=10000 )次操作。
接下来有 N (从1开始记数)辆列车的信息,每辆列车先有一个数字 Xi(1 <= Xi <= 100 ),表示该列车有Xi个乘客,接下来Xi行乘客信息,每个乘客包含名字(20个字符以内,不包含空白符)和人品(0<= RP <=30000)。
再接下来有 M 行操作信息,一共有3种操作,分别为

GETON Xi name RP 表示有一个叫name的人品为RP的人登上第Xi列车

JOIN Xi Xj 表示有将第Xj辆列车合并到Xi辆列车

GETOUT Xi 表示从第Xi辆列车踢出一个人品最差的人

测试数据保证每个操作均合法,即不会将已经被合并到其他列车的列车再进行合并,也不会从一辆空列车里踢出乘客
 

 

Output
对于每个 GETOUT 命令,输出被踢出的那个人的名字
 

 

Sample Input
3 5 2 xhd 0 zl 1 2 8600 1 ll 2 1 Ignatius 3 GETOUT 1 JOIN 1 2 GETOUT 1 GETON 3 hoho 2 GETOUT 3
 

 

Sample Output
xhd zl hoho

此时需要的是以结构体的内容人队  
优先队列怎么优先法呢?
其实就是在结构体中去定义排序的原则
struct node
{
 string name;
 int rp;
 friend bool operator <(node a,node b)// 对结构体排序原则的定义 注意 这里排序的大小规则与结构体排序定义的恰好相反   
 {
  if(a.rp==b.rp) return a.name<b.name;
  else return a.rp>b.rp;
 }
}stu;
优先队列的使用又一次让我体会到结构体使用起来的快捷程度 嗯继续加油
附上ac代码
#include<stdio.h>
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
struct node
{
 string name;
 int rp;
 friend bool operator <(node a,node b)
 {
  if(a.rp==b.rp) return a.name<b.name;
  else return a.rp>b.rp;
 }
}stu;
int main()
{
 int m,n,t,i,x,y,si;
 string a,st;
 while(scanf("%d %d",&n,&m)!=EOF)
 {
  priority_queue <node> q[10001];
 
     for(i=1;i<=n;i++)
  {
   cin>>t;
   while(t--)
   {
    cin>>stu.name;
    cin>>stu.rp;
    q[i].push(stu);
   }
  }
  for(i=1;i<=m;i++)
     {
      cin>>a;
      if(a=="GETON")
      {
       cin>>x;
       cin>>st;
       cin>>si;
       
       stu.name=st;
       stu.rp=si;
       q[x].push(stu);
      }
    
      if(a=="GETOUT")
         {
       cin>>x;
       cout<<q[x].top().name<<endl;
       q[x].pop();
      
         }
    
      if(a=="JOIN")
      {
       scanf("%d %d",&x,&y);
       while(!q[y].empty())//  注意 用while写哦。。 这里用if wa过一次
       {
        q[x].push(q[y].top());
        q[y].pop();
       }
      
      }
     }
 }
 return 0;
}

以上是关于优先队列问题 get it !!的主要内容,如果未能解决你的问题,请参考以下文章

更新优先队列

什么是堆排序和优先队列? [关闭]

js模拟队列----小优先队列

python队列queue 之优先级队列

基于链表的优先队列

PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例