思路:二分答案,注意一下二分最后取l,因为问的是至少
check函数,注意判一下迁越能力过小无法到达下一个星系的情况就行
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
#include <set>
using namespace std;
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define pb push_back
#define IOS ios::sync_with_stdio(false)
#define int long long
typedef long long ll;
const int N=1e6+2;
int n,k;
int a[N];
bool check(int mid)
{
ll day=0;//需要的天数
int temp=0;
while( temp<n )//没到终点
{
day++;
int nxt = upper_bound(a+1,a+1+n,a[temp]+mid)-a-1;//下一个地点的下标
if( nxt == temp) return false;//如果无法移动到下个地点返回false
temp=nxt;
}
return day<=k;
}
void solve()
{
int l=1,r=a[n];
while( l<=r )
{
int mid=(l+r)>>1;
if( check(mid) ) r=mid-1;
else l=mid+1;
}
//注意取l
cout<<l<<endl;
}
signed main()
{
///!!!
// freopen("data.txt","r",stdin);
//!!!
IOS;
cin>>n>>k;
_for(i,1,n) cin>>a[i];
solve();
}