HDU 1276 士兵队列训练问题 【模拟】
2015-08-01 09:30
429 查看
士兵队列训练问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4475 Accepted Submission(s): 2100
Problem Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2 20 40
Sample Output
1 7 19 1 19 37
#include <cstdio> #include <cstring> bool vis[5500]; int main (){ int T; scanf("%d", &T); while(T--){ int N; scanf("%d", &N); int k = N; for(int i = 1; i <= N; ++i) vis[i] = 1; if(N <= 3) { printf("1"); for(int i = 2; i <= N; ++i) if(vis[i]) printf(" %d",i); printf("\n"); continue; } while(1){ int temp2 = 0; for(int i = 1; i <= N; ++i){ if(vis[i]) temp2++; if(temp2 == 2){ vis[i] = 0; k--; temp2 = 0; } } if(k <= 3) break; int temp3 = 0; for(int i = 1; i <= N; ++i){ if(vis[i]) temp3++; if(temp3 == 3){ vis[i] = 0; k--; temp3 = 0; } } if(k <= 3) break; } printf("1"); k--; for(int i = 2; k > 0; i++){ if(vis[i]){ printf(" %d",i); k--; } } printf("\n"); } return 0; }
相关文章推荐
- java 基础知识1
- java标识符命名规则
- UIViewController 视图控制器
- fatjar ClassNotFound解决办法
- HDU1710 二叉树的前、中、后遍历
- Crimewave (Uva 563 最大流拆点)
- Linux下的库操作工具-nm、ar、ldd、ldconfig和ld.so
- Window 常用命令
- 欢迎使用CSDN-markdown编辑器
- kali下PostgreSQL修改密码与配置详情
- 基本固件框架的追踪研读之SETUP命令的处理3
- 智行火车票能否把用户的敏感信息屏蔽?
- hiho一下 第五十六周
- OC Xcode6.4下开启和关闭ARC
- JSP样式表加载不上的问题
- Docker Misconceptions
- 画虚线
- SpringMVC注解
- 1312 - Cricket Field
- 我的Android进阶之旅------>解决Bug:打开eclipse报错,发现了以元素 'd:skin' 开头的无效内容。此处不应含有子元素。