C6-不Nan的过河

题目描述

某楠也要过Zexal过的那条河,通过借助河中间的石砖过到河对岸去,这些石砖以直线排列。河的长度为L,当某楠走到或跨过坐标为L的点时,就算到达了河对岸。但是强迫症的某楠最多只能跨m次,请你计算某楠过河最长的一步最少是多少。注意从岸边迈向石头和从石头迈向岸边也算1步。

输入

多组数据输入

每组数据第一行有3个正整数L,n,m,L表示河的宽度,n表示有n个石砖,m表示某楠最多只能跨m步。(1≤L≤10^9,1≤n≤10^5,1≤m≤10^5)

第二行有n个不同的正整数分别表示这n个石砖在数轴上的位置(所有相邻的整数之间用一个空格隔开。

输出

每组数据输出一个整数,表示某楠迈的最长一步的最小距离。

输入样例

5 2 3
1 3

输出样例

2 

放一张PPT来

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<climits>
using namespace std;

int a[100005],L,n,m;

bool judge(int k)
{
    int cnt = 0, pre = a[0];
    for(int i = 1; i < n; i ++)
    {
        if(a[i] - pre > k)
        {
            pre = a[i-1];
            cnt ++;
            if(a[i] - pre > k)
                return 0;
        }
    }
    if(cnt > m)
        return 0;
    return 1;
}
void solve()
{
    int l = 0;
    int r = L;
    int mid;
    while(r > l)
    {
        mid = (l + r) >>1;
        if(judge(mid)) r = mid;
        else l = mid + 1;
    }
    cout<<l<<endl;
}
int main()
{
    while(cin>>L>>n>>m)
    {
        a[0] = 0;
        n++;
        for(int i = 1; i < n; i ++)
            cin>>a[i];
        sort(a+1, a+n);
        a[n++] = L;//把河对岸当做最后一个石头
        solve();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/kubab119/p/11946017.html