赛码网_在线编程_军训队列

来源:互联网 发布:治痘痘最好的方法知乎 编辑:程序博客网 时间:2024/05/04 20:25

军训队列

题目描述

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

输入

第一行为组数N,接着为N行学生人数,学生人数不超过5000。

样例输入

2

20

40

输出

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

样例输出

1 7 19

1 19 37


#include<stdio.h>#include<iostream>#include<vector>using namespace std;int N,M;int main(){    scanf("%d",&N);    while(N--){        scanf("%d",&M);        vector<int> students(M+1,0);        vector<bool> flag(M+1,false);//标记 是否出列【默认 false 都没出列】        int count=M;        int k=0;        while(1){            if(count>3){                k=0;                for(int i=1;i<=M;++i){                    if(flag[i]==false){                        k++;                        if(k%2==0){//从1数2                            flag[i]=true;                            count--;                        }                    }                }            }else                break;            if(count>3){                k=0;                for(int i=1;i<=M;++i){                    if(flag[i]==false){                        k++;                        if(k%3==0){//从1数3                            flag[i]=true;                            count--;                        }                    }                }            }else                break;        }        vector<int> ans;        for(int i=1;i<=M;++i){            if(flag[i]==false)                ans.push_back(i);        }        for(int i=0;i<ans.size();++i){            if(i==0)printf("%d",ans[i]);            else printf(" %d",ans[i]);        }        printf("\n");    }        return 0;}


0 0
原创粉丝点击