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;
    }

     
  • 相关阅读:
    vue-resource请求
    vue的生命周期
    Swift-多类型封装
    Swift
    Swift-structures 和 classes 初始化
    iOS-延时加载,延时初始化
    Swift-Closures
    WKWebView-填坑总结
    存档&&解档游戏状态
    循环引用 && weak strong
  • 原文地址:https://www.cnblogs.com/huangguodong/p/4665306.html
Copyright © 2011-2022 走看看