杭电 1276士兵队列训练问题

还记得上篇博文中我送给大家的愚人节礼物吗?先想想看,你从镜子里看到了什么?其实你看到了一个自信的自己,因为你刚才送给了自己一个微笑,不管你今天遇到了什么不顺心的事,还是纠结于某段感情,都请告诉自己没什么大不了,明天又是崭新的一天,太阳依旧为你升起,你是自然界最伟大的奇迹,希望大家喜欢我送的这个礼物。

接下来跟大家聊什么呢?关于部队的问题,说起部队,我想起了我高中一个同桌考上了梦想中的清华大学,而且是国防生,好牛的,学费全免,不过有时要进行训练,训练就要站队呀,看看下面的题,有关于士兵训练的。祝福你们也能实现自己的梦想~~

士兵队列训练问题

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


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

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

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

Sample Input
  
  
2 20 40

Sample Output
  
  
1 7 19 1 19 37

代码
#include<stdio.h>
int main()
{
	int n,i,sum,m;
	char sb[5009];
	while (scanf("%d",&n)!=EOF)
	{
		while(n--)
		{
			scanf("%d",&m);
			sum=m;
			for(i=1;i<=m;i++)
				sb[i]=i;
			if(m<=3)
			{
				printf("1");
				for(i=2;i<=m;i++)
					printf("%d",i);
				printf("\n");
				continue;
			}
			while(1)
			{
				int flag=0;
				for(i=1;i<=m;i++)
			{
				if(sb[i]!=-1)
				{
					flag++;//将被删掉的数全部赋值为-1;最后只要输出不是-1的数就可
                                              以了,和以前校门外的树(oj上的题)的思考方向一样
				}
				if(flag==2)
				{
					flag=0;
					sb[i]=-1;
					sum--;//用sum来控制每一轮删掉后剩下数的个数,一旦小于三个,
                                              就停止删数,将剩余的三个数输出就可以
				}
			}
			if(sum<=3) break;
			flag=0;
			for(i=1;i<=m;i++)
			{
				if(sb[i]!=-1)
				{
					flag++;
				}
				if(flag==3)
				{
					flag=0;
					sb[i]=-1;
					sum--;
				}
			}
			if(sum<=3) break;
		}
		printf("1");
		for(i=2;i<=m;i++)
		{
			if(sb[i]!=-1)
				printf(" %d",sb[i]);
		}
		printf("\n");
	}
	}
	return 0;
}
                              欢迎大家留言评论,雁过留声,人过留名嘛


  
  
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值