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\n");
				continue;
			}
			else if(n==2)
			{
				printf("1 2\n");
				continue;
			}
			else if(n==3)
			{
				printf("1 2 3\n");
				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\n",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#\n",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("\n");
	     	}
	     	else if(m<k)
	     	{
	     		for(i=1;i<=m;i++)
	     		{
	     			if(i==1)
	     			printf("%d",b[i]);
	     			else
	     			printf(" %d",b[i]);
	     		}
	     		printf("\n");
	     	}
		}
	return 0;
}
时间: 2024-12-29 15:53:29

hdoj 1276 士兵队列训练问题【模拟】的相关文章

HDU 1276 士兵队列训练问题(模拟)

原题代号:HDU 1276 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1276 题目原题: 士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8914    Accepted Submission(s): 3940 Problem Description 某部队进行新兵队

用链表实现轻院1276士兵队列训练问题

士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8554    Accepted Submission(s): 3809 Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行

【HDOJ】1276 士兵队列训练问题

初看这道题目很像尤瑟夫问题, 区别是每次都是从1开始.解法也很类似.数学解递推公式.假定第K次报数后,余下人数不超过3个人.若第K次为1-3报数,那么由这三个数的当前索引n可推上一次报数之前的编号为n+(n-1)/2,该式也很容易理解,因为每三个人就要去掉第三个人,因此(n-1)/2可以知道已经减少了几个人,加上基础编号n就是上一次报数的编号:若第K次为1-2报数,这个很简单,当前索引为n的数在上一次报数时编号为2n-1.因此,县求解报数的次数,然后逆向求得余下的数字的初始值. 1 #inclu

hdu 1276 士兵队列训练问题

Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数...,以后从头开始轮流进行一至二报数.一至三报数直到剩下的人数不超过三人为止. Input 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000. Output 共有N行,分别对应输入的新兵人

HDU 1276 士兵队列训练问题 解题心得

原题: Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数...,以后从头开始轮流进行一至二报数.一至三报数直到剩下的人数不超过三人为止. Input 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000. Output 共有N行,分别对应输入的新兵人数,每行

ACM学习历程—HDU 1276 士兵队列训练问题(队列)

Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠 拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数...,以后从头开始轮流进行一至二报数.一至三报 数直到剩下的人数不超过三人为止. Input 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000. Output 共有N行,分别对应输入的新兵人数,每行输出

hdu 1276士兵队列问题【queue】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1276 士兵队列训练问题                                               Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)                                                           

(hdu step 8.1.6)士兵队列训练问题(数据结构,简单模拟——第一次每2个去掉1个,第二次每3个去掉1个.知道队伍中的人数&lt;=3,输出剩下的人 )

题目: 士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 56 Accepted Submission(s): 37   Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三

士兵队列训练问题(杭电1276)

/*士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3585    Accepted Submission(s): 1674 Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开