士兵队列训练问题 HDU 1276
Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。 Input 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。 Output 共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。 Sample Input 2 20 40 Sample Output 1 7 19 1 19 37
题目就是一群人围到一起,先是一二报数,报二的人出列,然后一到三报数,报三的人出列,如此循环直到剩下不超过三个人为止。
我自己是使用数组模拟链表的方式写的,然后看到还有人写队列,然后又自己码了一遍队列的。
注意不要理解错题目。
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <queue> #include <map> #include <string> using namespace std; int n, T, m; int a[5004]; int main() { scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i++) a[i] = i; m = n; while (m > 3) { for (int i = 0; i < 2; i++) { a[0] = 0; if (i == 0) { for (int j = 1; j <= m; ++j) { if (j % 2 == 0); else a[++a[0]] = a[j]; } m = a[0]; } else { for (int j = 1; j <= m; ++j) { if (j % 3 == 0); else a[++a[0]] = a[j]; } m = a[0]; } if (m <= 3) break; } } for (int i = 1; i < m; i++) printf("%d ", a[i]); printf("%d\n", a[m]); } return 0; }
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <queue> #include <map> #include <string> using namespace std; int n, T, m, tmp; queue<int> q; int main() { scanf("%d", &T); while (T--) { while (!q.empty()) q.pop();//多组数据日常操作 scanf("%d", &n); for (int i = 1; i <= n; i++) q.push(i); while (q.size() > 3) { for (int i = 0; i < 2; ++i) { if (i == 0) { m = q.size(); for (int i = 1; i <= m ; i++) { tmp = q.front(); q.pop(); if (i % 2 != 0) q.push(tmp); } } else { m = q.size(); for (int i = 1 ; i <= m; i++) { tmp = q.front(); q.pop(); if (i % 3 != 0) q.push(tmp); } } if (q.size() <= 3) break; } } while (q.size() > 1) { printf("%d ", q.front()); q.pop(); } cout << q.front() << endl; } return 0; }
其实队列和数组模拟差不多,就是换了个壳子感觉。