这个题目思路很简单,自己一时没想到。题目意思就略过。关键是二分查找最小距离,对于每个距离,使用贪心的方法检测是否可行,复杂度为 O(nlogn).
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 1000000000;
const int maxn = 500020;
int distanse[maxn];
int mindis = 0 ;
int L,n,m;
bool across(int dis)
{
int cnt =0 ;
int curDis =0 ;
for (int i =0 ; i <= n ; i++)
{
if(curDis+dis < distanse[i+1] && curDis+dis >= distanse[i])
{
curDis = distanse[i];
cnt++ ;
}
else if (curDis + dis < distanse[i])
{
return false;
}
}
return cnt > m ? false : true ;
}
void bisection(int left , int right)
{
int mid ;
while(left<=right)
{
mid = (left + right)/2;
if ( across(mid) )
{
right = mid -1 ;
mindis = mid;
}
else
{
left = mid + 1 ;
}
}
}
int main()
{
while(EOF!=scanf("%d%d%d",&L,&n,&m))
{
for(int i=0 ; i<n ; i++)
{
scanf("%d",distanse+i);
}
distanse[n] = L;
distanse[n+1] = INF;
sort(distanse,distanse+n);
mindis =0;
bisection(distanse[0],distanse[n]);
printf("%d\n",mindis);
}
return 0;
}