1 条题解

  • 0
    @ 2026-6-19 10:30:21

    📝 题目大意

    给定一个长度为 NN 的数列 AA,进行恰好 KK 次操作:每次删除第一个元素并在末尾添加 00。输出最终数列。

    💡 解题思路

    1. 题目分析N,K100N, K \leq 100,数据范围极小,直接模拟即可。每次操作相当于将整个数组向左"滑动"一位,末尾补 00

    2. 算法推导:使用 std::deque(双端队列)来模拟这个过程——deque 支持 O(1)O(1) 的头部删除(pop_front)和尾部插入(push_back)。具体步骤:

      • 读入 NNKK,将 NN 个元素依次 push_back 入队
      • 循环 KK 次,每次执行 pop_front() 移除队首,再 push_back(0) 在队尾补 00
      • 最后依次输出队列中的所有元素(每次输出队首后 pop_front
    3. 边界与细节:当 KNK \geq N 时,所有原始元素都会被移除,最终数组全为 00(如样例 2)。使用 deque 而非 vector 是为了避免每次删除头部元素时的 O(N)O(N) 移动开销,不过由于 NN 很小,用 vector 也能通过。

    ⏱️ 复杂度分析

    • 时间复杂度O(N+K)O(N + K),每次 pop_frontpush_back 均为 O(1)O(1)
    • 空间复杂度O(N)O(N),存储队列中的元素

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    deque<int> a; // 双端队列,支持 O(1) 的头删和尾插
    int main()
    {
        int n, k;
        scanf("%d%d", &n, &k);
        for (int i = 1, x; i <= n; i++)
        {
            scanf("%d", &x);
            a.push_back(x); // 将元素依次加入队尾
        }
        while (k--) // 执行 K 次操作
        {
            a.pop_front(); // 移除第一个元素
            a.push_back(0); // 在末尾添加 0
        }
        while (a.size()) // 输出剩余的所有元素
        {
            printf("%d ", a.front());
            a.pop_front();
        }
        return 0;
    }
    
    • 1

    信息

    ID
    653
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者