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; }