zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    演示一个简单的Redis队列
    Quartz.net 基于配置的调度程序实践
    阿里云OSS分片上传DEMO
    java基础 -- 关键字static的用法
    java基础 -- 关键字final的用法
    Linux中安装软件和各种常用命令
    python获取网页信息的三种方法
    jquery中获取ajax请求返回数据的方法
    Jquery为动态添加的元素添加事件
    js中时间戳转换成xxxx-xx-xx xx:xx:xx类型日期格式的做法
  • 原文地址:https://www.cnblogs.com/tonghao/p/4693918.html
Copyright © 2011-2022 走看看