40代文系SEがAtCoder Beginner Contest 143 D - Trianglesを解いてみました。
(defun solve ()
(let* ((n (read))
(l (make-array n :initial-contents (loop repeat n collect (read)))))
(format t "~A~%" (solve2 l))))
(defun solve2 (l)
(let* ((ll (make-array (1+ (length l)))))
(loop for i from 0 below (length l) do (setf (aref ll i) (aref l i)))
(setf (aref ll (1- (length ll))) (1+ (expt 10 3)))
(sort ll #'<)
(loop with ans = 0
for i from 0 below (- (length ll) 2)
do (loop for j from (1+ i) below (- (length ll) 1)
do (incf ans (solve1 ll i j)))
finally
(return ans))))
(defun solve1 (l i j)
(labels ((f (min max)
(if (= (1+ min) max)
min
(let* ((li (aref l i))
(lj (aref l j))
(mid (+ min (floor (- max min) 2)))
(lmid (aref l mid)))
(if (< lmid (+ li lj))
(f mid max)
(f min mid))))))
(- (f j (1- (length l))) j)))
(solve)