
#include <iostream>
using namespace std;
int n, k, v[50001];
void sort();
bool test(int);
int main(){
int min, max, mid;
cout<<"請輸入服務數n, 基地台數 k :";
scanf("%d %d", &n, &k);
v[0]=1;v[1]=2;v[2]=5;v[3]=7;v[4]=8;
/*
cout<<"請輸入位址 : ";
for (int i=0;i<n;i++){
scanf("%d", &v[i]);
}
for (int i=0;i<n;i++){
printf("%d ", v[i]);
}
printf("\n");
*/
sort();
min=1;
max=(v[n-1]-v[0])/k+1;
while(min<max){//二分法
mid=(min+max)/2;
if(test(mid))max=mid;//有含蓋, 再縮小看看
else min=mid+1;//沒含蓋, 放大看看
}
printf("最大直徑 : %d",max);
}
bool test(int x){//計算是否有在含蓋範圍內
int next, count=0;
for(int i=0;i<n;){ next=v[i]+x;//蓋下一個基地台的含蓋範圍 count++;//建立一座基地台 if(count>k)return false;//超出最大的基地台了
if(v[n-1]<=next && count<=k)return true;//最後一個基地台, 有含蓋最後一個服務站
do{
i++;
}while(v[i]<=next);
}
return false;
}
void sort(){
for (int i=0;i<=n-2;i++){
for (int j=i+1;j<=n-1;j++){ if(v[i]>v[j]){
int tmp=v[i];
v[i]=v[j];
v[j]=tmp;
}
}
}
}