数学—士兵队列训练问题

来源:互联网 发布:淘宝开店教程全集下载 编辑:程序博客网 时间:2024/06/02 07:07

注意:士兵数可能开始就<4.


I - 士兵队列训练问题

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit
 
Status
Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。 
 
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。 
 
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。 
 
Sample Input
2
20
40 
 
Sample Output
1 7 19

1 19 37 


代码:


#include<cstdio>#include<cstring>#include<algorithm>using namespace std; int yi[5050],er[5050];void xiao(int ss){for (int i=1;i<=ss;i++)er[i]=i;int ke;while (1){if (ss<4)//士兵数开始<4,直接输出。 {printf("%d",er[1]);for (int i=2;i<=ss;i++)printf(" %d",er[i]);printf("\n");break; }ke=0;for (int i=1;i<=ss;i++){if (i%2!=0){ke++;    yi[ke]=er[i]; }}if (ke<4){printf("%d",yi[1]);for (int i=2;i<=ke;i++)printf(" %d",yi[i]);printf("\n");break;}ss=0;for (int i=1;i<=ke;i++){if (i%3!=0){ss++;    er[ss]=yi[i];}}/*if (ss<4)//未考虑开始士兵树小于4; {printf("%d",er[1]);for (int i=2;i<=ss;i++)printf(" %d",er[i]);printf("\n");break; }*/}}int main(){int n,shu[120];scanf("%d",&n);for (int i=1;i<=n;i++)scanf("%d",&shu[i]);for (int i=1;i<=n;i++)xiao(shu[i]);return 0;}


0 0
原创粉丝点击