***Allocate Books

Problem Link: https://www.interviewbit.com/old/problems/allocate-books/

class Solution:
    # @param A : list of integers
    # @param B : integer
    # @return an integer
    def books(self, bookarr, students):
        
        def allocate(bookarr,l,h,students,mid):
            
            maxPages=mid
            studCount=1
            pageCount=0
            for i in range(len(bookarr)):
                if(bookarr[i]>maxPages):
                    return False
                if(pageCount+bookarr[i]>maxPages):
                    studCount+=1
                    if(studCount>students):
                        return False
                    pageCount=bookarr[i]
                else:
                    pageCount=pageCount+bookarr[i]
            return True
        
        def bsearch(l,h,bookarr):
            
            if(l<=h):
                mid=(l+h)//2
                if(allocate(bookarr,l,h,students,mid)==True):
                    # print("true",mid)
                    self.ans=min(self.ans,mid)
                    bsearch(l,mid-1,bookarr)
                else:
                    bsearch(mid+1,h,bookarr)
            
            return self.ans
        
        n=len(bookarr)
        l=max(bookarr)
        h=sum(bookarr)
        # If there are not enough books,
        # return 
        if(n<students):
            return -1
        self.ans=float('inf')
        bsearch(l,h,bookarr)
        return self.ans

Last updated