1 条题解
-
0
📝 题目大意
有 张卡片从上到下堆叠,每张卡片上写有一个整数。从底部取出 张卡片,保持原有顺序不变,整体放到顶部。输出操作后从上到下的卡片序列。
💡 解题思路
- 题目分析:,数据规模极小,直接模拟即可。关键约束是 ,保证操作非平凡。
- 算法推导:
- 原序列从上到下为 。
- 底部 张卡片为 。
- 将它们移到顶部后,新序列变为:。
- 因此只需从下标
pos = N - K + 1开始,循环遍历数组 次,下标超出 时回到 。 - 代码中
k %= n是防御性写法(虽然题目保证 ),pos = n - k + 1定位新起点,cnt控制输出 个数,pos++后若pos > n回绕到1。
- 边界与细节:
- 恒成立,不存在 导致输出与原序列相同的情况(但即便出现,
k %= n会使k = 0,pos = n + 1,回绕后等价于pos = 1,仍然正确)。 - 输出末尾不能有多余空格,但本题评测通常容忍行末空格,且样例输出带空格,直接按代码格式输出即可。
- 恒成立,不存在 导致输出与原序列相同的情况(但即便出现,
⏱️ 复杂度分析
- 时间复杂度:,遍历数组一次。
- 空间复杂度:,存储数组 。
💻 标准代码 (C++)
#include <bits/stdc++.h> using namespace std; int main () { int n, k, a[105]; scanf("%d%d", &n, &k); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); // 1-indexed 读取卡片序列 k %= n; // 防御性取模,避免 k >= n 的异常情况 int pos = n - k + 1, cnt = 1; // pos: 新序列的起始下标(底部 K 张的第一张) while (true) { printf("%d ", a[pos]); // 输出当前卡片 cnt++; if (cnt > n) break; // 已输出 N 个数,结束 pos++; if (pos > n) pos = 1; // 循环回绕 } return 0; }
- 1
信息
- ID
- 817
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者