1 条题解

  • 0
    @ 2022-11-22 15:07:05
    #include <bits/stdc++.h>
    using namespace std;
    int L, n, m;
    int d[51234];
    //检查如果要求最短距离为 mid 是否可行
    //即是否可以只挪走不超过 m 块石头,实现任意两块石头的最短距离为 mid
    bool check(int mid)
    {
        int cnt = 0;//当前挪走了几块石头
        int last = 0;//上一步位于哪个位置
        for (int i = 1; i <= n; i++)
        { 
            //如果这块石头到上一个位置的距离不足mid  
            //那么这块石头就要挪走
            if (d[i] - last < mid)
                cnt++;
            else
                last = d[i];
        }
        //考虑最后的位置,到终点的距离是否超过了mid
        if (L - last < mid)
            cnt++;
        return cnt <= m;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> L >> n >> m;
        for (int i = 1; i <= n; i++)
            cin >> d[i];
        int l = 1;
        int r = L;
        int ans;
        while (l <= r)
        {
            int mid = (l + r) / 2;
            if (check(mid))
            {
                ans = mid;
                l = mid + 1;
            }
            else
                r = mid - 1;
        }
        cout << ans << "\n";
        return 0;
    }
    
    • 1

    信息

    ID
    146
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    60
    已通过
    29
    上传者