zoukankan      html  css  js  c++  java
  • (原创)7-1 银行业务队列简单模拟 (30 分)

    设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。

    输入格式:

    输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号。编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。数字间以空格分隔。

    输出格式:

    按业务处理完成的顺序输出顾客的编号。数字间以空格分隔,但最后一个编号后不能有多余的空格。

    输入样例:

    8 2 1 3 9 4 11 13 15
    

    输出样例:

    1 3 2 9 11 4 13 15

    解题思路:这道题的意思就是模拟队列,将偶数的数字存到b窗口,将奇数的数字存到a窗口,而且是先进先出,所以可以采用队列,将偶数的放在b队列,将奇数的放在a队列;然后每输出两个a队列中的元素
    再输出一个b队列中的元素;
    还有注意的一个点就是,最后是a队列中的元素结尾还是b队列中的元素结尾,这个要分情况讨论;主要是最后空格的规范问题;
    解法一:模拟队列
    代码如下:
      1 #include<iostream>
      2 using namespace std;
      3 
      4 
      5 
      6 struct queue{
      7     int data[1005];      //用于存队列的数据; 
      8     int tail;            //用来记录从尾部插入了多少个元素; 
      9     int head;            //计数队头,方便取出队头的元素; 
     10 };
     11 
     12 void push(queue *q ,int  tmp )       //实现队列的push用法;传入类型为 queue 的指针 q;传入要入队的数tmp; 
     13 {
     14     q->tail ++;                      //每入队一个元素,尾部计数器+1; 
     15     q->data[q->tail] = tmp;          //将元素入队; 
     16 }
     17 
     18 int pop(queue *q)                    //取出队列的数字,从前端取出;此时要利用head记数; 
     19 {
     20     q->head++;                     //每取一个,就将head+1,记数; 
     21     return q->data[q->head];        //返回队头的元素;  
     22 } 
     23 
     24 void init(queue *q)                   //初始化; 
     25 {
     26     q->tail = -1 ;                     //将尾和头记数均初始化为-1; 
     27     q->head = -1;
     28 }
     29 
     30 int notEmpty(queue *q)                     //判断队列是否为空; 
     31 {
     32     int i ;
     33     if(q->tail == q->head)              //如果尾和头的记数一样,则队列为空; 
     34     {
     35         i = 0;    
     36     }
     37     else
     38     i = 1;
     39     return i;                           //判断队列不为空; 
     40 }
     41 int counta = 0,countb = 0;               //用counta 记录入a队列的个数;用countb  记录入b队列的个数; 
     42 int main()
     43 {
     44     queue a ;          //定义,实例化a; 
     45     queue b;           //定义,实例化b; 
     46     init(&a);            //初始化a队列,并要用引用符号; 
     47     init(&b);           //初始化b队列,并用引用符号; 
     48     int n ;
     49     int c;
     50     cin>>n;
     51     for(int i = 0 ; i < n ; i++)
     52     {
     53         cin>>c;
     54         if(c%2==0)
     55         {
     56             push(&b,c);              //如果是偶数,则进b队列; 
     57             countb++;             //countb相应+1; 
     58         }
     59         else
     60         {
     61             push(&a,c);           //如果是奇数,则进a队列; 
     62             counta++;             //counta相应+1; 
     63         }
     64 
     65     }
     66       //分情况,注意最后到底是a队列的数结尾还是b队列的数结尾,这影响格式; 
     67     if(counta > countb *2)                //counta大于两倍countb,是a队列的元素结尾,则a最后一个元素后面不能加空格; 
     68     {
     69             while(notEmpty(&a)||notEmpty(&b))        //当a队列不空或者b队列不空时; 
     70         {
     71             if(notEmpty(&a))                    //a队列不空; 
     72             {
     73                cout<<pop(&a);                 
     74                counta--; 
     75                if(counta != 0)
     76                cout<<" "; 
     77                cout<<pop(&a);                  //输出两个a队列的元素; 注意这里a最后一个元素后面不能加空格; 
     78                counta--;
     79                if(counta != 0)
     80                cout<<" ";    
     81             }
     82             if(notEmpty(&b))
     83             {
     84                 cout<<pop(&b);                //输出一个b队列的元素; 
     85                 cout<<" ";
     86             }
     87         }
     88     }
     89     else
     90     if(counta <= countb *2)             //counta小于等于两倍countb,是b队列的元素结尾,则b最后一个元素后面不能加空格; 
     91     {
     92             while(notEmpty(&a)||notEmpty(&b))
     93         {
     94             if(notEmpty(&a))
     95             {
     96                cout<<pop(&a);           //输出两个a队列的元素; 
     97                cout<<" ";
     98                cout<<pop(&a);
     99                cout<<" ";    
    100             }
    101             if(notEmpty(&b))
    102             {
    103                 cout<<pop(&b);           //输出一个b队列的元素,注意b队列最后一个元素的后面不能加空格; 
    104                 countb--;
    105                 if(countb != 0) 
    106                 {
    107                      cout<<" ";
    108                 }
    109 
    110             }
    111         }
    112     }
    113     
    114     
    115     
    116     return 0;
    117 }

    解法二:直接用stl中的queue;

     1 #include<iostream>
     2 #include<queue>              //队列头文件 
     3 using namespace std;
     4 
     5 
     6 long long int b[10005]; 
     7 queue<int>qa;        //定义一个qa队列,用于存放奇数 
     8 queue<int>qb;        //定义一个qb队列,用于存放偶数; 
     9 int tmp1;             //用于取出qa“每次最前” 的元素; 
    10 int tmp2;             //用于取出qa“每次最前” 的元素; 
    11 int n ;                
    12 int main()
    13 {
    14     cin>>n;
    15     for(int i = 0 ; i < n ; i++)
    16     {
    17         cin>>b[i];
    18         if(b[i]%2==0)    
    19         qb.push(b[i]);     //如果为偶数,则放入qb队列; 
    20         else 
    21         qa.push(b[i]);      //如果为奇数,则放入qa队列; 
    22     }
    23 
    24     int counta = qa.size();        //用counta 记录qa队列的长度; 
    25     int countb = qb.size();       //用countb  记录qb队列的长度; 
    26      //分情况,注意最后到底是qa队列的数结尾还是qb队列的数结尾,这影响格式;
    27     if(counta > countb *2)                            //counta大于两倍countb,是qa队列的元素结尾,则a最后一个元素后面不能加空格;
    28     {
    29             while(!qa.empty()||!qb.empty())      //当qa队列不空或者qb队列不空时;
    30         {
    31             if(!qa.empty())              //a队列不空;  
    32             {
    33                tmp1 = qa.front();        //取出qa 队头的元素; 
    34                cout<<tmp1;              //输出qa队头的元素; 
    35                qa.pop();                 //将qa队头的元素去掉; 
    36                counta--;               //qa长度-1; 
    37                if(counta != 0)         //注意这里a最后一个元素后面不能加空格; 
    38                cout<<" ";     
    39                tmp1 = qa.front();          //再进行一遍上面的操作; 
    40                cout<<tmp1;
    41                qa.pop();
    42                counta--;
    43                if(counta != 0)
    44                cout<<" ";    
    45             }
    46             if(!qb.empty())
    47             {
    48                 tmp2 = qb.front();          //取出qb 队头的元素;
    49                 cout<<tmp2;                  //输出qb队头的元素; 
    50                 qb.pop();                     //将qb队头的元素去掉; 
    51                 cout<<" ";
    52             }
    53         }
    54     }
    55     else
    56     if(counta <= countb *2)                         //counta小于等于两倍countb,是b队列的元素结尾,则b最后一个元素后面不能加空格; 
    57     {
    58             while(!qa.empty()||!qb.empty())             //当qa队列不空或者qb队列不空时; 
    59         {
    60             if(!qa.empty())                     //qa队列不空时; 
    61             {
    62                tmp1 = qa.front();           //与上面的if类似,只是不需要注意尾部是否输出空格; 
    63                cout<<tmp1;        
    64                qa.pop();
    65                cout<<" ";
    66                tmp1 = qa.front();
    67                cout<<tmp1;
    68                qa.pop();
    69                cout<<" ";    
    70             }
    71             if(!qb.empty())
    72             {
    73                 tmp2 = qb.front();          //与上面的if类似,需要注意尾部是否输出空格; 
    74                 cout<<tmp2;
    75                 qb.pop();
    76                 countb--;
    77                 if(countb != 0)
    78                 {
    79                      cout<<" ";
    80                 }
    81 
    82             }
    83         }
    84     }
    85 
    86     
    87     return 0;
    88 }
  • 相关阅读:
    java几种字符串反转
    iOS安全攻防(三):使用Reveal分析他人app
    信息与计算科学
    搜索框中“请输入搜索keyword”
    上传图片图像进行压缩后上传
    ExtractFileDir 与 ExtractFilePath 的差别
    java中接口的定义与实现
    《IT运维之道》
    Linux查看硬件信息,主板型号及内存硬件,驱动设备,查看设备,查看CPU。
    CentOS6.5 x86_64 配置Broadcom 43XX系列 无线网卡驱动
  • 原文地址:https://www.cnblogs.com/yewanting/p/10555154.html
Copyright © 2011-2022 走看看