还记得上篇博文中我送给大家的愚人节礼物吗?先想想看,你从镜子里看到了什么?其实你看到了一个自信的自己,因为你刚才送给了自己一个微笑,不管你今天遇到了什么不顺心的事,还是纠结于某段感情,都请告诉自己没什么大不了,明天又是崭新的一天,太阳依旧为你升起,你是自然界最伟大的奇迹,希望大家喜欢我送的这个礼物。
接下来跟大家聊什么呢?关于部队的问题,说起部队,我想起了我高中一个同桌考上了梦想中的清华大学,而且是国防生,好牛的,学费全免,不过有时要进行训练,训练就要站队呀,看看下面的题,有关于士兵训练的。祝福你们也能实现自己的梦想~~
士兵队列训练问题
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;
}
欢迎大家留言评论,雁过留声,人过留名嘛