# CF_Div2_1907_D
CF_Div2_1907_D
题目描述
给定 n 个区间,每次移动 k 步,确保第 i 次移动后在第 i 个区间 (l[i], r[i]) 里,求可完成任务的 k 的最小值。
思路剖析
这是一个简单的二分答案题,重点关注 check 函数的实现。
对于每个二分到的 k(即移动 0~k 步),初始区间为 [0, 0]。
每次移动的范围都是 [l - k, r + k],对于第 i 步:
- l = max(left[i], l - k)
- r = min(right[i], r + k)
如果在任何一步 l > r,则不可行。
代码实现
void solve() {
int t, n;
cin >> t;
while (t--) {
cin >> n;
vector<int> left(n), right(n);
for (int i = 0; i < n; i++) {
cin >> left[i] >> right[i];
}
auto check = [&](int k) {
int l = 0, r = 0;
for (int i = 0; i < n; ++i) {
l = max(left[i], l - k);
r = min(right[i], r + k);
if (l > r) return false;
}
return true;
};
// 找到最小的 k 使得 true
int L = 0, R = 1e9;
while (L < R) {
int m = L + (R - L) / 2;
if (check(m)) R = m;
else L = m + 1;
}
cout << L << '\n';
}
}

浙公网安备 33010602011771号