1 条题解
-
0
📝 题目大意
给定长度为 的序列 和区间 ,对每个 找出区间内最接近 的整数 (即 最小)。若 落在区间内,则 ;否则取较近的端点。
💡 解题思路
- 题目分析:,,直接 即可。问题本质是对每个 做一次 clamp 操作,将其限制在 内。
- 算法推导:
- 对于每个 ,考虑三种情况:
- 若 :区间内所有值都大于 ,最近的显然是左端点 。
- 若 :区间内所有值都小于 ,最近的显然是右端点 。
- 若 : 本身就在区间内,距离为 ,取 。
- 因此只需对每个 执行
clamp(A_i, L, R)。
- 对于每个 ,考虑三种情况:
- 边界与细节:
- 时区间退化为一个点,答案全为 (或 ),逻辑依然正确。
- 注意输出格式:末尾换行,元素间空格分隔。
⏱️ 复杂度分析
- 时间复杂度:,每个元素 处理。
- 空间复杂度:,只需几个变量。
💻 标准代码 (C++)
#include <iostream> #include <algorithm> using namespace std; int main() { int N, L, R; cin >> N >> L >> R; for (int i = 0; i < N; i++) { int A; cin >> A; // 将 A 限制在 [L, R] 区间内 int x; if (A < L) x = L; // A 在区间左侧,取左端点 else if (A > R) x = R; // A 在区间右侧,取右端点 else x = A; // A 在区间内,取自身 cout << x << (i == N - 1 ? "\n" : " "); // 输出,末尾换行 } return 0; }
- 1
信息
- ID
- 752
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者