Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- void merge(int a[], int l, int mid, int r){
- int n1= mid -l +1;
- int n2= r-mid;
- int b[n1], c[n2];
- for(int i=0; i<n1; i++) b[i]=a[i+l];
- for(int j=0; j<n2; j++) c[j]=a[mid +j +1];
- int i=0, j=0, k=l;
- while(i<n1 && j<n2){
- if(b[i]<=c[j]) a[k++]=b[i++];
- else a[k++]=c[j++];
- }
- while(i<n1) a[k++]=b[i++];
- while(j<n2) a[k++]=c[j++];
- }
- void mergeSort(int a[],int l, int r){
- if(l<r){
- int mid =(l + r)/2;
- //calling recursive frunctions for two subarrays
- mergeSort(a, l,mid);
- mergeSort(a,mid+1,r);
- //merging arrays
- merge(a,l,mid,r);
- }
- }
- bool isPossible(int a[], int n, int cows, int mid){
- int curPos=a[0];
- int filled=1;
- for(int i=1; i<n; i++){
- if(curPos+ mid <=a[i]){
- curPos=a[i];
- filled++;
- if(filled==cows) return true;
- }
- }
- return false;
- }
- int findMinDist(int a[], int n, int cows){
- int low=a[0], high=a[n-1];
- int res=0;
- while(low< high){
- int mid=(low + high)/2;
- if(isPossible(a,n, cows, mid)){
- res=max(res,mid);
- low=mid +1;
- }else high = mid;
- }
- return res;
- }
- int main() {
- int t;
- cin>>t;
- while(t--){
- int n,cows;
- cin>>n>>cows;
- int a[n];
- for(int i=0; i<n; i++) cin>>a[i];
- mergeSort(a,0,n-1);
- int ans=findMinDist(a,n, cows);
- cout<<ans<<endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment