HDU 1276 士兵队列训练问题
Problem Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2
20
40
Sample Output
1 7 19
1 19 37
题意:略。
分析:直接进行模拟,虽然算法有点笨。
AC源代码(C语言):
1 #include<stdio.h> 2 3 int main() 4 { 5 int data[5001]; 6 int i,N,T,a,b; 7 scanf("%d",&N); 8 while(N--) 9 { 10 scanf("%d",&T); 11 a=T; 12 13 for(i=1;i<=T;i++) 14 data[i]=i; 15 while(a>3) //这里不能用do--while,因为当输入的T小于3时,不进入循环!否则程序是WA! 16 { 17 b=0; 18 for(i=1;i<=T;i++) 19 { 20 if(data[i]==0) continue; 21 else b+=1; 22 if(b==2) 23 { 24 data[i]=0; 25 b=0; 26 } 27 } 28 a=a-a/2; 29 if(a<=3) break; 30 b=0; 31 for(i=1;i<=T;i++) 32 { 33 if(data[i]==0) continue; 34 else b+=1; 35 if(b==3) 36 { 37 data[i]=0; 38 b=0; 39 } 40 } 41 a=a-a/3; 42 } 43 b=0; 44 for(i=1;i<=T;i++) 45 { 46 if(data[i]==0) continue; 47 else 48 { 49 b+=1; 50 if(b==a) 51 printf("%d\n",data[i]); 52 else 53 printf("%d ",data[i]); 54 } 55 } 56 } 57 return 0; 58 }
2013-05-14