Algorithm Notes

LJXin

记录算法刷题、竞赛思路与编程成长,希望每一篇都讲清楚一点、写扎实一点。

# 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';
    }
}

AI 使用说明:仅使用 AI 进行排版

posted @ 2026-04-16 14:24  kliu_365  阅读(14)  评论(0)    收藏  举报
TOP