Algorithms: Design and Analysis Part 1 by Tim Roughgarden