# activity selection: greedy is provably optimal here

 function select_activities(activities): # each has (start, finish)
   activities.sort_by(finish_time)
   chosen = []
   last_finish = -infinity
   for start, finish in activities:
      if start >= last_finish:

        chosen.append((start, finish))
        last_finish = finish
   return chosen              # exchange argument proves optimalit
 y
