zoukankan      html  css  js  c++  java
  • 队列

    Description

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

    Input

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

    Output

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

    Sample Input

    2
    20
    40
     

    Sample Output

    1 7 19
    1 19 37
     
     
     
    解题思路(其实是看别人博客,才自己打出来的):分两种情况,n>3和n<=3。如果是第一种,直接输出就好了,第二种,就用循环中两个if加标记flag模拟。

     
    代码如下:
     
     

    #include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
    int T;
    int a[5005];
    cin>>T;
    while(T--)
    {
    int n,i;
    cin>>n;
    for(i=0;i<n;i++)
    a[i]=i+1;
    int sum=n;
    if(n<=3)
    {
    if(n==1)
    cout<<1<<endl;
    if(n==2)
    cout<<1<<" "<<2<<endl;
    if(n==3)
    cout<<1<<" "<<2<<" "<<3<<endl;
    continue;                                //直接 结束这组案例
    }
    while(1)
    {
    int flag=0;
    for(i=0;i<n;i++)
    {
    if(a[i])       //判断a[i]为不为零
    flag++;       //计数
    if(flag==2)     //等于2就将报数为2的数变0
    {
    flag=0;
    a[i]=0;
    sum--;         //表示剩下的人数,及不为零的数
    }
    }
    if(sum<=3)
    break;
    flag=0;
    for(i=0;i<n;i++)
    {
    if(a[i])         
    flag++;     
    if(flag==3)
    {
    flag=0;
    a[i]=0;
    sum--;
    }
    }
    if(sum<=3)    
    break;
    flag=0;
    }
    cout<<1;
    sum--;
    for(i=1; ;i++)
    {
    if(a[i])
    {
    cout<<" "<<a[i];
    sum--;
    }
    if(!sum)
    break;
    }
    cout<<endl;
    }
    return 0;
    }

     
  • 相关阅读:
    mysql主从之过滤复制
    mysql主从之主从延时监控及原因分析
    mysql误删搭建有主从的主库master binlog处理
    mysql 主从复制原理,概念,故障的检控/分析/处理
    mysql之主从复制搭建
    mysql表的物理存储结构及逻辑结构
    sql语句执行过程及mysql权限管理
    linux安装mysql5.7.30 及配置多实例
    mysql备份恢复之xtrabackup (XBK、Xbackup)
    mysql 备份之逻辑备份mysqldump, mysqlbinlog, 全备及参数说明
  • 原文地址:https://www.cnblogs.com/huangguodong/p/4665306.html
Copyright © 2011-2022 走看看