码迷,mamicode.com
首页 > 其他好文 > 详细

C6-不Nan的过河

时间:2019-11-27 23:23:07      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:std   pac   limit   space   sort   mamicode   cout   数据   using   

题目描述

某楠也要过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;
}

 

C6-不Nan的过河

标签:std   pac   limit   space   sort   mamicode   cout   数据   using   

原文地址:https://www.cnblogs.com/kubab119/p/11946017.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!