이번 문제는 이분탐색을 통해 해결하는 문제였다. 이분탐색의 범위에 대해서 고민을 많이 했던 것 같다. 이분탐색의 범위는 0과 배열의 최대값으로 하였다.
#include <iostream>
#include <algorithm>
#define MAX 5001
using namespace std;
int n, m;
int arr[MAX];
void Input(){
cin>>n>>m;
for(int i=0; i<n; i++){
cin>>arr[i];
}
}
bool Check(int mid){
int cnt=1;
int mini=10001;
int maxi=0;
int idx=-1;
for (int i=idx+1; i<n; i++){
mini=min(mini, arr[i]);
maxi=max(maxi, arr[i]);
if(maxi-mini>mid){
cnt++;
mini=arr[i];
maxi=arr[i];
idx=i;
}
}
return cnt<=m;
}
int Solution(){
int big=0;
for(int i=0; i<n; i++){
big=max(big, arr[i]);
}
int result=0;
int front=0;
int back=big;
while(front<=back){
int mid=(front+back)/2;
if(Check(mid)){
result=mid;
back=mid-1;
}
else
front=mid+1;
}
return result;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Input();
cout<<Solution()<<endl;
return 0;
}