军训队列

题目描述

 

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

 

输入

 

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

 

样例输入

 

2

20

40

输出

 

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

 

样例输出

 

1 7 19

1 19 37

 

时间限制C/C++语言:1000MS其它语言:3000MS

内存限制C/C++语言:65536KB其它语言:589824KB

 

#include<cstdio>
int t, n, r, finalcnt;
bool is2;
void dfs(int x, int m) {
  if(x<=3) {
    finalcnt = x;
    is2 = (m==3);
    return ;
  }
  ++r;
  return dfs(x-x/m, m==2?3:2);
}
int main() {
  scanf("%d", &t);
  while(t--) {
    scanf("%d",&n);
    r= 0;
    dfs(n,2);
    printf("1");
    for(int i=2;i<=finalcnt;++i) {
      int tmp = i;
      bool is = is2;
      for(int j=0;j<r;++j) {
        if(is) {
          tmp = tmp*2-1;
        } else {
          tmp = (tmp*3-1)/2;
        }
        is=!is;
      }
      printf(" %d", tmp);
    }
    printf("\n");
  }
  return 0;
}

 

#include<iostream>
#include<vector>
using namespace std;
int main()
{
  int N;
  cin>>N;
  for(int i=0;i<N;i++)
  {
    int num;
    cin>>num;
    int *p=new int[num];
    for(int j=1;j<=num;j++)
    p[j-1]=j;
    int count=num;
     bool t=true;
    while(count>3)
    {
     
      if(t==true)
      {
        int count1=0;
        for(int i=0;i<num;i++)
        {
         if(p[i]!=0)
           count1++;
          if(count1%2==0&&p[i]!=0)
          {
            p[i]=0;
            count--;
          }
      //      if(count<=3)
       //       break;
            
        }
        t=false;
        
      }
           if(t==false)
      {
        if(count<=3)
          continue;
        int count2=0;
        for(int i=0;i<num;i++)
        {
         if(p[i]!=0)
           count2++;
          if(count2%3==0&&p[i]!=0)
          {
            p[i]=0;
            count--;
          }
        //    if(count<=3)
        //      break;
            
        }
        t=true;
        
      }
      
    }
    for(int i=0;i<num;i++)
      if(p[i]!=0)
        cout<<p[i]<<" ";
    cout<<endl;
    
    
  }
  
}

 

#include<iostream>
#include<list>
using namespace std;
int main()
{
	int n;
	cin >> n;
	for (int num = 0; num<n; num++)
	{
		int m;
		cin >> m;
		list<int> l;
		for (int i = 1; i <= m; i++)
		{
			l.push_back(i);
		}
		int flag = 0;
		while(l.size() > 3)
		{
			if (flag == 0)
			{
				flag = 1 - flag;
				list<int>::iterator it = l.begin();
				it++;
				for (;it != l.end(); it++)
				{
					it=l.erase(it);
					if (it == l.end())
						break;
				}

			}
			else
			{
				flag = 1 - flag;
				list<int>::iterator it = l.begin();
				it++;
				it++;
				for (; it != l.end(); it++)
				{
					it = l.erase(it);
					if (it == l.end())
						break;
					it++;
					if (it == l.end())
						break;
				}

			}
		}
		for (list<int>::iterator it = l.begin(); it != l.end(); it++)
		{
			cout << (*it) <<" ";
		}
		cout << endl;

	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值