1 条题解
-
0
📝 题目大意
给定一个长度为 的正整数数列,相邻元素不相等。反复找到第一个相邻两项差的绝对值不为 的位置,在它们之间补全所有缺失的整数(递增或递减补全),直到所有相邻元素的差的绝对值都为 。输出最终数列。
💡 解题思路
-
题目分析:,,数据范围很小,直接模拟即可。表面上题目要求"每次找第一个差不为 1 的位置插入,然后重新扫描",但实际上可以一次遍历完成,因为处理完当前对后,结果序列的最后一个元素恰好就是 ,不会影响后续处理。
-
算法推导:
- 先将 放入结果数组
result。 - 遍历 ,对于每一对 :
- 若 (上升):依次插入 。
- 若 (下降):依次插入 。
- 最后插入 本身。
- 输出
result数组。
- 先将 放入结果数组
-
边界与细节:
- 相邻两数差已经为 时,内层循环不执行,只插入 本身,不会重复插入。
- 插入的中间值不包含端点(
x < A[i+1]或x > A[i+1]),避免重复。 - 题目保证 ,所以无需考虑相等的情况。
⏱️ 复杂度分析
- 时间复杂度:,最坏情况下 ,即 ,完全可行。
- 空间复杂度:,用于存储结果序列。
💻 标准代码 (C++)
#include <iostream> #include <vector> using namespace std; int main() { int N; cin >> N; vector<int> A(N); for (int i = 0; i < N; i++) { cin >> A[i]; } vector<int> result; result.push_back(A[0]); // 先放入第一个元素 for (int i = 0; i < N - 1; i++) { if (A[i] < A[i + 1]) { // 上升段:插入中间递增的数 for (int x = A[i] + 1; x < A[i + 1]; x++) { result.push_back(x); } } else { // 下降段:插入中间递减的数 for (int x = A[i] - 1; x > A[i + 1]; x--) { result.push_back(x); } } result.push_back(A[i + 1]); // 插入当前对的右端点 } for (size_t i = 0; i < result.size(); i++) { if (i > 0) cout << " "; // 空格分隔输出 cout << result[i]; } cout << endl; return 0; } -
- 1
信息
- ID
- 708
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者