; marzullo's algorithm
(define (make-table arrivals departures)
(sort
(append
(map (lambda (x) (cons x -1)) arrivals)
(map (lambda (x) (cons x 1)) departures))
(lambda (xs ys)
(if (= (car xs) (car ys))
(< (cdr xs) (cdr ys))
(< (car xs) (car ys))))))
(define (marzullo arrivals departures)
(let ((best 0) (cnt 0) (beststart 0) (bestend 0))
(let loop ((t (make-table arrivals departures)))
(if (null? t)
(values best beststart bestend)
(begin
(set! cnt (- cnt (cdar t)))
(when (< best cnt)
(set! best cnt)
(set! beststart (caar t))
(set! bestend (caadr t)))
(loop (cdr t)))))))
(define arrivals '(10 12 11 13 14 12 9 14 12 10))
(define departures '(15 14 17 15 15 16 13 15 17 18))
(call-with-values
(lambda () (marzullo arrivals departures))
(lambda (best beststart bestend)
(display best) (newline)
(display beststart) (newline)
(display bestend) (newline)))
(define departures '(15 15 17 15 15 16 15 15 17 18))
(call-with-values
(lambda () (marzullo arrivals departures))
(lambda (best beststart bestend)
(display best) (newline)
(display beststart) (newline)
(display bestend) (newline)))