【AtCoder ADT】
拡大市松模様と色分けの最小値比較
(2026-04-28easy1800DE)

前回は、

関連記事

1. D – Enlarged Checker Board

(defun tile-white-p (N A B row col)
  (let* ((H (* A N))
	 (W (* B N)))
    (assert (<= 0 row (1- H)))
    (assert (<= 0 col (1- W)))
    (evenp (+ (floor row A) (floor col B)))))


(defun write-tiles (N A B)
  (loop for i from 0 below (* A N)
	  do (loop for j from 0 below (* B N)
		   do (princ (if (tile-white-p N A B i j)
				 #\. #\#)))
	     (terpri)))

(defun main ()
  (let* ((N (read))
	 (A (read))
	 (B (read)))
    (write-tiles N A B)))

#-swank(main)
Code language: Lisp (lisp)
1. D – Enlarged Checker Board

2. E – Colorful Beans

はじめは、豆を何個か食べて、mini-maxみたいな感じで最大値を求めるのかと思って思案しましたが、この問題では1つしか食べません。
なので、まずはドットリストにしたペアを色に応じて分類し、それぞれを昇順に並べた先頭を比較して、最大を求めました。

(defun hash-list (pairs)
  (loop for pair across pairs
	with ht = (make-hash-table)
	do (push (car pair)
		 (gethash (cdr pair) ht '()))
	finally (return ht)))

;; (classified-list acn) ;=> ((40 100) (20 30))
(defun classified-list (pairs)
  (let* ((ht (hash-list pairs)))
    (loop for lst being each hash-value of ht
	  collect (sort lst #'<) )) )

(defun minimums (pairs)
  (loop for lst in (classified-list pairs)
	collect (car lst)))

(defun solve (pairs)
  (reduce #'max (minimums pairs)))

(defun read-dot-pairs (N)
  (loop repeat N
	collect (cons (read) (read)) into lst
	finally (return (coerce lst 'vector))))

(defun main ()
  (let* ((N (read))
	 (pairs (read-dot-pairs N)))
    (princ (solve pairs))))

#-swank(main)Code language: Lisp (lisp)
2. E – Colorful Beans

無事に全問正解しました。

2. E – Colorful Beans