士兵队列训练问题:某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的

本文介绍了一种通过交替使用两个队列实现的新兵队列训练算法,该算法通过一至二报数和一至三报数的方式筛选新兵,最终输出剩余新兵的原始编号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
输入:
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。

输出:
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。

样例输入:
2
20
40
样例输出:
1 7 19
1 19 37

思路:利用两个队列实现,q1队列用来从一至二报数,非2的进入q2,;q2用来从一至三报数,非3的进入队列q1,直至两个队列中任意一个队列元素数小于等于3。其中用到bool变量来决定哪个队列元素出队,哪个队列元素如队。需要注意的是每次一个队列出队完成后都要重新初始化,否则将会有你意想不到的错误(本人亲测)。一下就是具体的源码:

#include <iostream>
#define MAXSIZE 5001
using namespace std;

typedef struct queue
{
    int data[MAXSIZE];
    int front;
    int rear;
    int capacity;
}Queue;
void InitQueue(Queue *q)
{
    q->front=0;
    q->rear=0;
    q->capacity=0;
}
void EnterQueue(Queue *q,int &data)
{
    if(MAXSIZE!=q->rear)
    {
        q->data[++q->rear]=data;
        q->capacity++;
    }
}
int OuterQueue(Queue *q)
{
    int data;
    if(q->front!=q->rear)
    {
        data=q->data[++q->front];
        q->capacity--;
    }
    return data;
}
int main()
{
    int N,m,data,m1,m2;
    Queue q1,q2;
    cin>>N;
    while(N--)
    {
        InitQueue(&q1);
        InitQueue(&q2);
        bool isq1=true;
        cin>>m;
        for(int i=1;i<=m;i++)
            EnterQueue(&q1,i);
        while(q1.capacity>3||q2.capacity>3)
        {
            if(isq1)
            {
                m1=q1.capacity;
                for(int i=1;i<=m1;i++)
                {
                    if(i%2!=0)
                    {
                        data=OuterQueue(&q1);
                        EnterQueue(&q2,data);
                    }
                    else
                        OuterQueue(&q1);
                }
                isq1=false;
                InitQueue(&q1);
            }
            else
            {
                m2=q2.capacity;
                for(int i=1;i<=m2;i++)
                {
                    if(i%3!=0)
                    {
                        data=OuterQueue(&q2);
                        EnterQueue(&q1,data);
                    }
                    else
                        OuterQueue(&q2);
                }
                isq1=true;
                InitQueue(&q2);
            }
        }
        if(isq1)
        {
            cout<<q1.data[1];
            for(int i=2;i<=q1.capacity;i++)
                cout<<" "<<q1.data[i];
            cout<<endl;
        }
        else
        {
            cout<<q2.data[1];
            for(int i=2;i<=q2.capacity;i++)
                cout<<" "<<q2.data[i];
            cout<<endl;
        }
    }
    return 0;
}
### 如何清理 Harbor 镜像仓库以释放磁盘空间 为了有效管理并优化存储资源,在 Harbor 中可以采取多种策略来清理不再使用的镜像,从而释放磁盘空间。 #### 使用垃圾回收机制 (Garbage Collection) Harbor 提供了内置的垃圾收集功能,用于清除未被引用的对象,如旧版本的层文件和配置数据。执行此操作前建议先停止所有正在运行的服务实例,以免造成不必要的冲突或丢失当前工作中的更改[^3]。 可以通过命令行工具 `docker-compose` 或者直接通过 API 调用来触发 GC 进程: 对于 Docker Compose 方式部署的情况: ```bash cd /path/to/harbor/installation/ ./prepare docker-compose run --rm gc ``` 如果采用 Helm Chart 安装,则需进入 Core Pod 内部并通过 curl 请求启动 GC 流程: ```bash kubectl exec -it <core-pod-name> sh curl http://localhost:8080/api/v2.0/system/gc/policies \ -X POST \ -H "Content-Type: application/json" \ -d '{"schedule":{"type":"Manual"},"registry_id":null}' ``` #### 设置保留策略 除了手动触发外,还可以设置自动化的保留规则,比如只保存最新的 N 个标签或是特定时间段内的构建成果。这有助于长期维持系统的整洁度而不必频繁干预。 访问 Admin 页面 -> Projects -> Select Project -> Configuration 下找到 Cleanup Policy 来定义这些参数[^4]。 #### 删除无用项目/库 定期审查各个项目的实际需求,及时移除那些已经废弃不用或者重复存在的 repository 可显著减少占用量。注意这一动作不可逆,请谨慎确认后再行动。 以上措施结合起来能够有效地帮助管理员维护好 Harbor 实例上的可用容量状况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值