【AtCoder ABC378B】Garbage Collection(Common Lisp)

関連記事

1. 問題

2. コード

ルールとクエリは、ドットリストで記録して、ベクタでまとめました。

(defun collect-day (trash day rules)
  (declare (type fixnum trash day)
	   (type (simple-array cons (*))))
  (let* ((rule (aref rules (1- trash)))
	 (qi (car rule))
	 (ri (cdr rule)))
    (multiple-value-bind (q r) (floor day qi)
      (cond ((<= r ri) (+ ri (* qi q)))
	    (t (+ ri (* qi (1+ q))))))))

(defun read-pairs (n)
  (let* ((vec (make-array n :element-type 'cons)))
    (loop for i from 0 below n
	  do (setf (aref vec i)
		   (cons (read) (read)))
	  finally (return vec))))

(defun main ()
  (let* ((n (read))
	 (rules (read-pairs n))
	 (q (read))
	 (queries (read-pairs q)))
    (loop for query across queries
	  do (print (collect-day (car query)
				 (cdr query) rules)))))

#-swank(main)
Code language: Lisp (lisp)
2. コード