Loading

P2678 [NOIP2015 提高组] 跳石头

题目链接

https://www.luogu.com.cn/problem/P2678

题目思路

记着存起点和终点。。
二分 mid 为两点之差
当前点和上一点的距离 >= mid时,更新上一点为当前点,当 < mid时cnt++相当于移除这块石头
当移除石头 <= m 时 l 更新 mid 增大,> m时 r 更新 mid 减小

题目代码

#include <iostream>
#include <algorithm>

using namespace std;
const int N = 50010;
int s[N];
int n, m, len;

bool check(int x)
{
    int res = 0, cnt = 0;
    for(int i = 1; i <= n; i ++ )
    {
        if(s[i] - res < x) cnt ++ ;
        else res = s[i];
    }
    return cnt <= m;
}


int main()
{
    cin >> len >> n >> m;
    for(int i = 1; i <= n; i ++ )
        cin >> s[i];
    s[++ n] = len;
    int l = 1, r = 1e9;
    while(l < r)
    {
        int mid = l + r + 1 >> 1;
        if(check(mid)) l = mid;
        else r = mid - 1;
    }
    cout << r << endl;
    return 0;
}
posted @ 2022-03-23 20:30  vacilie  阅读(55)  评论(0编辑  收藏  举报