首页 > 其他 > 详细

士兵队列训练问题 HDU 1276

时间:2021-01-15 13:19:16      阅读:26      评论:0      收藏:0      [点我收藏+]
技术分享图片
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;
}
队列

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

士兵队列训练问题 HDU 1276

原文:https://www.cnblogs.com/adelalove/p/14281330.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!