zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    1372
    SPOJ
    HDU 3966-Aragorn's Story 树链剖分+树状数组
    LightOJ 1348
    HihoCoder 1568 不一定合法括号序列
    LightOJ 1343
    LightOJ 1266
    LightOJ 1112
    HihoCoder 1328 BFS 搜索
    链表交集、合并、排序
  • 原文地址:https://www.cnblogs.com/kubab119/p/11946017.html
Copyright © 2011-2022 走看看