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): 2699    Accepted Submission(s): 1238

    Problem Description

    某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。

     

     

    Input

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

     

     

    Output

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

     

     

    Sample Input

    2

    20

    40

     

     

    Sample Output

    1 7 19

    1 19 37

    解题思路:

    1、  用队列实现。

    程序代码:

    #include<stdio.h>

    #include<string.h>

    #include<stdlib.h>

    #include<malloc.h>

    //定义一个队列

    struct queue

    {

        int capacity;

        int size;

        int *array;

        int front;

        int rear;

    };

    //入列

    int add(queue *q ,int value)

    {

        q->array[q->rear]=value;

        q->rear++;

        q->size++;

        return value;

    }

    int peek(queue *q)

    {

        return q->array[q->front];

    }

    //出列

    int pull(queue *q)

    {

        int value;

        value=q->array[q->front];

        q->array[q->front]=0;

        q->front++;

        q->size--;

        return value;

    }

    int get_size(queue *q)

    {

        return q->size;

    }

    int get_capacity(queue *q)

    {

        return q->capacity;

    }

    // 队列初始化

    int init_queue(queue *q,int capacity )

    {

        q->capacity=capacity;                    

        q->size=0;

        q->front=0;

        q->rear=0;

        q->array = (int *)malloc(capacity *sizeof(int));

        memset(q->array,0,sizeof(q->array));

        return 0;

    }

    // 每次都要全赋值为 0;

    int init_queue(queue *q)

    {

        q->size =0;

        q->front =0;

        q->rear = 0;

        return 0;

    }

    //  释放

    int free_queue(queue *q)

    {

        free(q);

        return 0;

    }

    int main()

    {

        int cases,i,n,j,num=2;

        queue *sq = NULL;

        queue *eq = NULL;

        while(scanf("%d",&cases)!=EOF)

        {

            while(cases--)

            {

                 sq = (queue*)malloc(sizeof(queue));

                 eq = (queue*)malloc(sizeof(queue));

                 scanf("%d",&n);

                 init_queue(sq,n);

                 init_queue(eq,n);

                 for(i=1; i<=n; i++)

                 {

                        add(sq,i);        // 把数据入队列

                 }

                 num=2;

                 while(1&&n>3)

                 {

                        i=1;

                        if(num==2)

                        {

                            while(sq->size>0)

                            {

                                if(i!=num)

                                {

                                    add(eq,pull(sq));    // 满足条件放到另一个队列里

                                    i++;

                                }

                                else

                                {

                                    pull(sq);              //不满足的 出队列 舍弃

                                    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;

    }

  • 相关阅读:
    pytorch获取模型某一层参数名及参数值方式
    PyTorch源码解读之torchvision.models
    torch.nn.Conv2d()函数详解
    UCF101
    ipynb格式转换
    linux下的压缩与解压缩
    tomcat 部署的项目图片名字带中文
    恢复oracle误删除数据
    项目中遇到的分布式高并发情况及解决方案
    poi 导出复杂表头 execl
  • 原文地址:https://www.cnblogs.com/zhouhongweihpu/p/3256020.html
Copyright © 2011-2022 走看看