import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
while(t>0){
int n=sc.nextInt();
int m=sc.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=sc.nextInt();
}
System.out.println(min_pages(arr,n,m));
t–;
}
sc.close();
}
public static int min_pages(int[] arr,int n,int m){
long sum=0;
if(n<m){
return -1;
}
for(int i=0;i<n;i++){
sum+=arr[i];
}
int start=0,end=(int)sum;
int result=Integer.MAX_VALUE;
while(start<=end){
int mid=(start+end)/2;
if(isPossible(arr,n,m,mid)){
result=Math.min(result,mid);
end=mid-1;
}
else{
start=mid+1;
}
}
return result;
}
public static boolean isPossible(int[] arr,int n,int m,int curr_min){
int studentReq=1;
int curr_sum=0;
for(int i=0;i<n;i++){
if(arr[i]>curr_min){
return false;
}
if(curr_sum+arr[i]>curr_min){
studentReq++;
curr_sum=arr[i];
}
if(studentReq>m){
return false;
}
else{
curr_sum+=arr[i];
}
}
return true;
}
}
Kindly check this code
hey @Rajput.apry
just Change in ispossible fun
if (curr_sum + arr[i] > curr_min) {
studentReq++;
curr_sum = arr[i];
if (studentReq > m) { **
** return false;
}
}
correct code
public static boolean isPossible(int[] arr, int n, int m, int curr_min) {
int studentReq = 1;
int curr_sum = 0;
for (int i = 0; i < n; i++) {
if (arr[i] > curr_min) {
return false;
}
if (curr_sum + arr[i] > curr_min) {
studentReq++;
curr_sum = arr[i];
if (studentReq > m) {
return false;
}
} else {
curr_sum += arr[i];
}
}
return true;
}