士兵队列训练问题 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;
}
队列

其实队列和数组模拟差不多,就是换了个壳子感觉。

posted @ 2021-01-15 12:06  月亮茶  阅读(57)  评论(0编辑  收藏  举报