zoukankan      html  css  js  c++  java
  • 优先队列问题 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;
    }
  • 相关阅读:
    技术牛人在阿里内网的公开信:“王坚,你为什么要放弃”
    hadoop日志【6】----mahout的速度
    基于命令行的mahout软件0.8版本Canopy算法分析的数据处理流程
    WolframAlpha
    颠覆编程方式的感知编码:Wolfram雄心勃勃的全新计算模式
    Autolayout及VFL经验分享
    IOS7 Text View 截断的问题解决
    Discuz 首页图文列表实现
    UIResponder详解
    IOS开发之----四舍五入问题
  • 原文地址:https://www.cnblogs.com/z1141000271/p/5324095.html
Copyright © 2011-2022 走看看