The Frog's Games 航电oj4004

The annual Games in frogs’ kingdom started again. The most famous game is the Ironfrog Triathlon. One test in the Ironfrog Triathlon is jumping. This project requires the frog athletes to jump over the river. The width of the river is L (1<= L <= 1000000000). There are n (0<= n <= 500000) stones lined up in a straight line from one side to the other side of the river. The frogs can only jump through the river, but they can land on the stones. If they fall into the river, they
are out. The frogs was asked to jump at most m (1<= m <= n+1) times. Now the frogs want to know if they want to jump across the river, at least what ability should they have. (That is the frog’s longest jump distance).

Input
The input contains several cases. The first line of each case contains three positive integer L, n, and m.
Then n lines follow. Each stands for the distance from the starting banks to the nth stone, two stone appear in one place is impossible.

Output
For each case, output a integer standing for the frog’s ability at least they should have.

Sample Input
6 1 2
2
25 3 3
11
2
18

Sample Output
4
11

#二分长度
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long int 
#define ull unsigned long long int 
#define e 2.718281828459
#define INF 0x7fffffff
#pragma warning(disable:4996)
#define pf printf
#define sf scanf
#define max(a,b) (a)>(b)?(a):(b);
#define pi  acos(-1.0);
#define  eps 1e-9;

int a[500005];
int len, m, n;//,maxlen=0
bool judge(int mid) {
    /*if (mid < maxlen)  return false;*/

    if (mid*m < len)  return false;


    int i = 1, pre = 0;
    int step = 0;

    while (i<=n+1) {//此处i不可以大于n+1

        if (a[i] - a[pre] > mid) return false;//mid太小

        while (a[i] - a[pre] <= mid && i <= n+1 )
            i++;
        pre = i - 1;//从当前的步循环判断可以跳到的最远石头。
        step++;
        if (step > m)  return false;
    }
    return true;

}
int main(void) {

    while (sf("%d %d %d", &len, &n, &m)!=EOF) {
        a[0] = 0, a[n + 1] = len;
        for (int i = 1; i <= n; i++)
            sf("%d", &a[i]);

        sort(a + 1, a + 1 + n);
        /*for (int i = 1; i <= n + 1; i++) {
            maxlen = maxlen > a[i] - a[i - 1] ? maxlen : a[i] - a[i - 1];
        }
*/
        int right = len, left = 0;
        int mid;

        while (right >= left) {
            mid = (left + right) / 2;

            if (judge(mid))
                right = mid - 1;//mid太大,不用几下就跳过去了
            else
                left = mid + 1;//mid太小,m下跳不过去
        }

        cout << left << endl;
    }

    return 0;
}


猜你喜欢

转载自blog.csdn.net/jiruqianlong123/article/details/81393668