이번 문제는 이분탐색으로 해결하는 문제였다. 처음에는 이분탐색으로 해결하는 방법이 생각이 안나서 이분탐색을 빼고 생각해보았다.
이 방식의 문제점은 가장 큰 거리를 반으로 나눴을 때도 그 나눈 거리가 가장 큰 거리일 때 발생한다. m이 부족하다면 남은 거리를 나누지 못하게 되어 최대거리가 커지게 된다.
이분탐색으로 해결할 수 있는 방식을 다시한번 생각해보았고, 구글의 힘을 조금 빌려 문제를 해결할 수 있었다.
#include <iostream>
#include <algorithm>
#define MAX 101
using namespace std;
int n, m, l;
int point[MAX];
int dis[MAX];
void Input(){
cin>>n>>m>>l;
for(int i=0; i<n; i++){
cin>>point[i];
}
sort(point, point+n);
}
void GetDistance(){
dis[0]=point[0];
for(int i=1; i<n; i++){
dis[i]=point[i]-point[i-1];
}
dis[n]=l-point[n-1];
}
int BinarySearch(){
int front=1;
int back=l-1;
while(front<back-1){
int mid=(front+back)/2;
int cnt=0;
for(int i=0; i<=n; i++){
if(dis[i]>mid){
if(dis[i]%mid==0){
cnt+=dis[i]/mid-1;
}
else{
cnt+=dis[i]/mid;
}
}
}
if(m<cnt){
front=mid;
}
else{
back=mid;
}
}
return back;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Input();
GetDistance();
cout<<BinarySearch()<<endl;
return 0;
}