HDUOJ 1276 - 士兵队列训练问题
2016-07-28 12:37
253 查看
[align=left]Problem Description[/align]
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
[align=left]Input[/align]
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
[align=left]Output[/align]
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
[align=left]Sample Input[/align]
2
20
40
[align=left]Sample Output[/align]
1 7 19
1 19 37
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
[align=left]Input[/align]
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
[align=left]Output[/align]
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
[align=left]Sample Input[/align]
2
20
40
[align=left]Sample Output[/align]
1 7 19
1 19 37
//直接进行模拟即可 //注意每次数到队伍尾部再重新开始 #include <cstdio> int main() { int T; int n; scanf("%d", &T); while (T--) { scanf("%d", &n); int a[5005] = {0}; for (int i = 1; i <= n; ++i){ a[i] = i; } if (n <= 3) { printf("1"); for(int i = 2; i <= n; i++) if(a[i]) printf(" %d", a[i]); printf("\n"); continue; } int num = n; while (1) { int counts = 0; for (int i = 1; i <= n; ++i)//按照1-2数 { if (a[i]) counts++; if (counts == 2) { a[i] = 0; counts = 0; num--; } } if (num <= 3) break; counts = 0; for (int i = 1; i <= n; ++i)//按照1-3数 { if (a[i]) counts++; if (counts == 3) { a[i] = 0; counts = 0; num--; } } if (num <= 3) break; } printf("1");//排头永远不可能出列 num--; for (int i = 2; num; ++i) { if (a[i]) { printf(" %d", a[i]); num--; } } printf("\n"); } return 0; }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1002