本文主要是介绍hdoj 1276士兵队列训练问题 【开灯类型】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
跟开灯问题差不多!!算是拓展吧!!
Problem Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2 20 40
Sample Output
1 7 19 1 19 37
#include<stdio.h>
#include<string.h>
int main()
{
int a[5005];
int n, t, ans, flag;
scanf( "%d", &t );
while( t -- )
{
memset( a, 0, sizeof(a) );
scanf( "%d", &n );
int m = n;
while( n > 3 )
{
int q = 1, p = m, flag = 0;
while( q <= p )
{
if( a[q] == 0 &&flag != 2 )
++flag;
if( flag == 2&&a[q] == 0 )
{
a[q] = 1;
--n;
flag = 0;
}
q++;
}
if( n <= 3 ) break;
q = 1, p = m, flag = 0;
while( q<=p )
{
if( a[q] == 0&&flag != 3 )
++flag;
if( flag == 3&&a[q] == 0 )
{
a[q] = 1;
--n;
flag = 0;
}
q++;
}
}
int b[3] = {0}, j = 0;
for( int i =1; i <= m; i ++ )
if( a[i] == 0 )
b[j++] = i;
printf( "%d", b[0] );
for( int i = 1; i < 3; i ++ )
if( b[i] )
printf( " %d", b[i] );
printf( "\n" );
}
}
这篇关于hdoj 1276士兵队列训练问题 【开灯类型】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!