zoukankan      html  css  js  c++  java
  • ACM/ICPC 之 "嵌套"队列 -插队(POJ2259)

      这里插队的意思就是排队时遇到熟人则插到其后,否则排到队尾。(这个习惯不太好)(题意)


      题目要求我们模拟“插队模型”和队列的入队和出队完成此算法。

      由于题目的输入输出很多,此题的查找操作(找到熟人)需要控制到O(1),因此映射每一个人际圈(所属同一队伍的意思)的编号而非每个人就很重要了,可以将不同人际圈的编号依次入队,而非每个人依次入队,这样主队列中的元素就是各人际圈的编号,而将入队的每个人压入到该人际圈,这样一种思想就是标题上所写的"嵌套"队列了(纯属杜撰)。

      具体代码如下:

     1 //嵌套队列-插队:遇到熟人则插在其后,否则在队尾,按操作输入后输出Dequeue的编号
     2 //Time:141ms    Memory:760K
     3 #include<iostream>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<queue>
     7 using namespace std;
     8 #define MAX 1001
     9 #define MAX_NUM 1000001 //编号
    10 queue<int> team[MAX];    //队伍
    11 queue<int> q;     //主队列-保存各队伍入队顺序
    12 bool v_team[MAX];    //队列已入队标记
    13 int ele[MAX_NUM];    //映射:编号-队伍
    14 int main()
    15 {
    16     int n;    //队列数
    17     int scenario = 0;
    18     
    19     while (scanf("%d", &n), n)
    20     {
    21         /*Init*/
    22         memset(v_team, false, sizeof(v_team));
    23         for (int i = 0; i < n; i++)
    24             while (!team[i].empty()) team[i].pop();
    25         while (!q.empty()) q.pop();
    26         /*Input*/
    27         for (int i = 0; i < n; i++)
    28         {
    29             int m;    //队员数
    30             scanf("%d", &m);
    31             for (int j = 0; j < m; j++)
    32             {
    33                 int mem;
    34                 scanf("%d", &mem);
    35                 ele[mem] = i;
    36             }
    37         }
    38         /*Main*/
    39         char command[10];
    40         printf("Scenario #%d
    ", ++scenario);
    41         while (scanf("%s", command), strcmp(command, "STOP"))
    42         {
    43             if (!strcmp(command, "ENQUEUE"))    //ENQUEUE
    44             {
    45                 int mem;
    46                 scanf("%d", &mem);
    47                 //不存在存在该元素队列
    48                 if (!v_team[ele[mem]])
    49                 {
    50                     v_team[ele[mem]] = true;
    51                     q.push(ele[mem]);    //压入team number
    52                 }
    53                 team[ele[mem]].push(mem);
    54             }
    55             else {    //DEQUEUE
    56                 int mem = team[q.front()].front();
    57                 team[q.front()].pop();
    58                 if (team[ele[mem]].empty())
    59                 {
    60                     v_team[ele[mem]] = false;
    61                     q.pop();    //抛出team number
    62                 }
    63                 printf("%d
    ", mem);
    64             }
    65         }
    66         printf("
    ");
    67         
    68     }
    69     
    70     return 0;
    71 }

    他坐在湖边,望向天空,她坐在对岸,盯着湖面
  • 相关阅读:
    nop 配置阿里cdn 联通4g 页面显示不全 查看源代码发现被截断
    HTTP 错误 500.21 模块 IIS Web Core
    nopcommerce4.0 安装步骤
    2017-12-08高级.net 面试小结
    图片上传
    每个部门绩效成绩第二名 sql server 查询 ( 替代 not in )
    Vmware虚拟机与主机连接的三种模式及使用
    PE,VG,PV,LV概念与结构关系
    windows忘记 oracle的用户名和密码
    虚拟机CentOS打开终端设置快捷键
  • 原文地址:https://www.cnblogs.com/Inkblots/p/5276728.html
Copyright © 2011-2022 走看看