1 条题解
-
0
📝 题目大意
给定一个长度为 的数列 ,进行恰好 次操作:每次删除第一个元素并在末尾添加 。输出最终数列。
💡 解题思路
-
题目分析:,数据范围极小,直接模拟即可。每次操作相当于将整个数组向左"滑动"一位,末尾补 。
-
算法推导:使用
std::deque(双端队列)来模拟这个过程——deque支持 的头部删除(pop_front)和尾部插入(push_back)。具体步骤:- 读入 和 ,将 个元素依次
push_back入队 - 循环 次,每次执行
pop_front()移除队首,再push_back(0)在队尾补 - 最后依次输出队列中的所有元素(每次输出队首后
pop_front)
- 读入 和 ,将 个元素依次
-
边界与细节:当 时,所有原始元素都会被移除,最终数组全为 (如样例 2)。使用
deque而非vector是为了避免每次删除头部元素时的 移动开销,不过由于 很小,用vector也能通过。
⏱️ 复杂度分析
- 时间复杂度:,每次
pop_front和push_back均为 - 空间复杂度:,存储队列中的元素
💻 标准代码 (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
- 上传者