Drill

ProblemsC# › patterns

The smallest van that still finishes on time

hardpatternsBinary searchGreedyC#

A depot must clear a fixed queue of orders within a number of days. Orders go out in the order they were placed, and the question is the smallest daily capacity that gets through them in time.

SmallestCapacity(orders: list<int>, days: int) → int

C# needs a compiler and Drill does not host one yet, so this page is the reference rather than an exercise: the problem, worked examples, and the solution in full. To type it out, the same problem runs in Python.

Solve it in Python →

Where you start

public int SmallestCapacity(List<int> orders, int days) {
    
}

Worked examples

CallResult
SmallestCapacity(new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, 5)15
SmallestCapacity(new List<int> { 3, 2, 2, 4, 1, 4 }, 3)6
SmallestCapacity(new List<int> { 1, 2, 3, 1, 1 }, 4)3
SmallestCapacity(new List<int> { 5 }, 1)5

Hint

Do not search the orders — search the answer. Capacity is somewhere between the largest order and the sum of them all, and "does this capacity finish in time" only ever goes from no to yes.

Reference solution in C#
public int SmallestCapacity(List<int> orders, int days) {
    if (orders.Count == 0) return 0;
    int lo = 0, hi = 0;
    foreach (var order in orders) {
        if (order > lo) lo = order;
        hi += order;
    }
    while (lo < hi) {
        int mid = (lo + hi) / 2;
        int used = 1, room = mid;
        foreach (var order in orders) {
            if (order > room) {
                used++;
                room = mid;
            }
            room -= order;
        }
        if (used <= days) hi = mid;
        else lo = mid + 1;
    }
    return lo;
}

The same problem in another language

More patterns problems in C#