现在的位置: 首页 > 综合 > 正文

HDU 1276 士兵队列训练问题

2018年01月19日 ⁄ 综合 ⁄ 共 926字 ⁄ 字号 评论关闭

士兵队列训练问题

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

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

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

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

Sample Input
2 20 40
 

Sample Output
1 7 19 1 19 37

/*
HDOJ 1276 士兵队列训练问题 
*/
#include<iostream>
#include<stdio.h>
using namespace std;
#define N 5001
int a[N];

int main()
{
	int t,n,m,i,count;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(i=1;i<=n;i++)
			a[i]=i;
		m=n;
		while(n>3)
		{
			count=0;
			for(i=1;i<=m;i++)
			{
				if(a[i])
					count++;
				if(count==2)
				{
					a[i]=0;
					count=0;
					n--;
				}
			}
			count=0;
			if(n>3)
			{
				for(i=1;i<=m;i++)
				{
					if(a[i])
						count++;
					if(count==3)
					{
						a[i]=0;
						count=0;
						n--;
					}
				}
			}
		}
		count=0;
		for(i=1;i<=m;i++)
		{
			
			if(a[i])
			{
				printf("%d",i);
				count++;
				if(count!=n)
					printf(" ");
				else
					break;
			}			
		}
		printf("\n");
	}	
	return 0;
}

抱歉!评论已关闭.