```// Binary Search : Time Complexity : O(n * log(sum - mx))   or   O(n * log(sum))

import java.util.*;
import java.io.*;

class GFG {

public static void main(String args[])
{
int arr[]={10,20,10,30};
int n=arr.length;
int k=2;

System.out.print(minPages(arr,n,k));     // OUTPUT : 40
}

public static boolean isFeasible(int arr[],int n,int k, int ans){
int req=1,sum=0;
for(int i=0;i<n;i++){
if(sum+arr[i]>ans){
req++;
sum=arr[i];
}
else{
sum+=arr[i];
}
}
return (req<=k);
}

public static int minPages(int arr[],int n, int k){
int sum=0,mx=0;
for(int i=0;i<n;i++){
sum+=arr[i];
mx=Math.max(mx,arr[i]);
}
int low=mx,high=sum,res=0;

while(low<=high){
int mid=(low+high)/2;
if(isFeasible(arr,n,k,mid)){
res=mid;
high=mid-1;
}else{
low=mid+1;
}
}
return res;
}
}

// Naive Method : Time : Exponential (very slow)

import java.util.*;
import java.io.*;

class GFG {

public static void main(String args[])
{
int arr[]={10,20,10,30};
int n=arr.length;
int k=2;

System.out.print(minPages(arr,n,k));     // OUTPUT : 40
}

public static int sum(int arr[],int b, int e){
int s=0;
for(int i=b;i<=e;i++)
s+=arr[i];
return s;
}

public static int minPages(int arr[],int n, int k){
if(k==1)
return sum(arr,0,n-1);
if(n==1)
return arr[0];
int res=Integer.MAX_VALUE;
for(int i=1;i<n;i++){
res=Math.min(res,Math.max(minPages(arr,i,k-1),sum(arr,i,n-1)));
}
return res;
}
} ```