zoukankan      html  css  js  c++  java
  • hdu 1276 士兵排队问题(队列的练习使用)

    士兵队列训练问题
    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 2668    Accepted Submission(s): 1216


    Problem Description
    某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:

    从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,

    凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始

    轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。

    Input
    本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。

    Output
    共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。

    Sample Input
    2
    20
    40
     

    Sample Output
    1 7 19
    1 19 37
     

    Author
    Cai Minglun
     

    Source
    杭电ACM集训队训练赛(VI)
     

    Recommend
    lcy

    AC的代码:
     
    #include "stdio.h"
    #include "string.h"
    #include "stdlib.h"
    #include "malloc.h"
    struct queue
    {
     int capacity;  //容量
     int size;    //当前大小
     int *array; //存取编号的数组
     int tail; //队尾
     int end; //队头
    };

    int init_queue(queue *q)    //初始化
    {   
        q->size=0;
        q->tail=0;
        q->end=0;
        return 1;
       }
      
    int init_queue (queue* q,int capacity) //创建一个队列
    {
        q->capacity=capacity;
        q->size=0;
        q->tail=0;
        q->end=0;
        q->array=(int *)malloc(sizeof(int)*capacity);
        memset(q->array,0,sizeof(q->array));
        return 1;
       
        }

    int get_size(queue *q)   //当前队列大小
    {
        return q->size;
    }

    int get_capacity(queue *q) //队列的容量
    {
        return q->capacity;
    }

    int add(queue *q,int value) //t添加队列元素
    {
        q->array[q->end]=value;
        q->end++;
        q->size++;
        return value;
        }
       
    int pull(queue *q)  //c出队列
    {
        int value=q->array[q->tail];
        q->tail++;
        q->size--;
        return value;
        }
       
    int peek(queue *q)   
    {
        return q->array[q->tail];
    }

    int freequeue(queue*q) //销毁队列
    {
        free(q);
        return 1;
    }

       
        int main()
        {
            queue *sq=NULL;  //队列1
            queue *eq=NULL;  //队列2
            int cases,i,n,j,num=2;
            scanf("%d",&cases);
            while(cases-->0)
          {
             sq=(queue *)malloc(sizeof(queue));  //给队列1分配空间
              eq=(queue *)malloc(sizeof(queue)); //给队列2分配空间
              scanf("%d",&n);             
               init_queue(sq,n);   //给队列1初始化
              init_queue(eq,n);  //给队列2初始化
           
            for(i=1;i<=n;i++)    //为队列1添加元素
            {
              add(sq,i);
            }
            num=2;
            while(1&&n>3)
            {
                 i=1;
                 if(num==2)
                 {
                       while(sq->size>0)
                        {
                                        if(i!=num)    //不符合条件的进入队列2
                                        {
                                                  add(eq,pull(sq));
                                                  ++i;
                                        }
                                        else
                                        {            //符合条件的出队列
                                            pull(sq);
                                            i=1;   //注意  i值 返回成 1
                                           
                                        }
                        }
                        if(eq->size <=3)     //如果剩余 元素 满足跳出条件 就终止循环
                        {
                                    break;
                        }
                        num=3;
                        init_queue(sq);
                  }
                  else if(num==3)
                  {
                 
                       while(eq->size>0)       //同上
                        {
                                        if(i!=num)
                                        {
                                                  add(sq,pull(eq));
                                                  ++i;
                                        }
                                        else
                                        {
                                            pull(eq);
                                            i=1;
                                           
                                        }
                        }
                        if(sq->size <=3)
                        {
                                    break;
                        }
                        num=2;
                        init_queue(eq);
                        } 
                  }
                        
                     if(eq->size==0)   //跳出循环后 判断要输出那个队列的元素
                     {
                                   while(sq->size>1)
                                   {
                                                    printf("%d ",pull(sq));
                                                   
                                   }
                                   printf("%d ",pull(sq));
                                  
                     }
                      else
                      {
                          while(eq->size>1)
                          {
                                           printf("%d ",pull(eq));
                          }
                          printf("%d ",pull(eq));  
                        
                        
                      }
                   free(sq); //使用后释放申请的空间
                   free(eq);  //使用后释放申请的空间
                   }
                  
                  return 0;
                 
            }
       
       
       

  • 相关阅读:
    c# webapi 在swagger里添加全局过滤器
    axios get,post请求时带headers
    svn"重新定位"提示版本库uuid不匹配
    DevExpress XtraReport
    DevExpress GridControl List绑定方式下新增行的方法
    对Dev的GridControl/GridView控件进行分组并展开操作
    DevExpress GridControl控件行内新增、编辑、删除添加选择框
    JavaScript 中的FileReader对象(实现上传图片预览)
    数据库连接情况查询
    C#代码中实现两个表(DataTable)的关联查询(JOIN)
  • 原文地址:https://www.cnblogs.com/songmingtao/p/3255391.html
Copyright © 2011-2022 走看看