hdoj 1276 士兵队列训练问题【模拟】

士兵队列训练问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4558    Accepted Submission(s): 2125


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

 

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

 

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

 

Sample Input
2
20
40
 

 

Sample Output
1 7 19
1 19 37
注意最后的输出不一定是三个数  少于等于3就行
#include<stdio.h>
#include<string.h>
#define MAX 11000
int main()
{
	int t,n,m,i,j,k;
	int set[MAX],a[MAX],b[MAX];
    scanf("%d",&t);
		while(t--)
		{
			memset(set,0,sizeof(set));
			scanf("%d",&n);
			if(n==1)
			{
				printf("1
"); 
				continue;
			}
			else if(n==2)
			{
				printf("1 2
");
				continue;
			}
			else if(n==3)
			{
				printf("1 2 3
");
				continue;
			}
		    for(i=1;i<=n;i++)
		    {
		    	set[i]=i;
		    }
		    int l=1,ok=n;
		    while(1)
		    {
		    	 if(l&1)
		        {
		        	k=0;
		        	memset(a,0,sizeof(a));
		        	for(i=1;i<=n;i++)
		            {
		            	if(i%2!=0)
		            	{
		            		a[++k]=set[i];
		            	}
		            	else
		            	{
		            		--ok;
		            	}
	    	        }
	    	        //printf("%d
",k);
	    	        n=ok;
	    	        memset(set,0,sizeof(set));
	    	        for(i=1;i<=k;i++)
	    	        {
	    	        	set[i]=a[i];
	    	        }
		        }
	        	else
	        	{
	        		m=0;
	        		memset(b,0,sizeof(b));
	        		for(i=1;i<=n;i++)
	        	    {
	        	    	if(i%3==0)
	        	    	{
	        	    		--ok;
	        	    		continue;
	        	    	}
	        		    b[++m]=set[i];
	         	    }
	         	    n=ok;
	         	     //printf("%d#
",m);
	         	    memset(set,0,sizeof(set));
	         	    for(i=1;i<=m;i++)
	    	        {
	    	        	set[i]=b[i];
	    	        }
	        	}
	         	l++;
	         	if(n<=3)
	         	break;
		    }
	     	if(k<m)
	     	{
	     		for(i=1;i<=k;i++)
	     		{
	     			if(i==1)
	     			printf("%d",a[i]);
	     			else
	     			printf(" %d",a[i]);
	     		}
	     		printf("
");
	     	}
	     	else if(m<k)
	     	{
	     		for(i=1;i<=m;i++)
	     		{
	     			if(i==1) 
	     			printf("%d",b[i]);
	     			else
	     			printf(" %d",b[i]);
	     		}
	     		printf("
");
	     	}
		}
	return 0;
}
原文地址:https://www.cnblogs.com/tonghao/p/4693918.html