【AtCoder ADT】(E2026-04-27_1DE)

関連記事

1. D – Trick Taking

1巡のループで、TとC1の2つの色の最大値とその人を探します。


;;  (winner 4 2 '(1 2 1 2) '(6 3 4 5)) ;=> 4
(defun winner-of-trick-taking (N TT Cn Rn)
  (loop for i from 1 to N
        for Ci in Cn
        for Ri in Rn
        with C1 = (first Cn)
        with max_t = 0
        with max_c1 = 0
        with no1_t = nil
        with no1_c1 = nil
        when (and (= Ci TT) (> Ri max_t))
          do (setf max_t Ri
                   no1_t i)
        when (and (= Ci C1) (> Ri max_c1))
          do (setf max_c1 Ri
                   no1_c1 i)
        finally (return (if no1_t no1_t no1_c1))))

(defun read-nums (N)
  (loop repeat N collect (read)))

(defun main ()
  (let* ((N (read))
         (TT (read))
         (Cn (read-nums N))
         (Rn (read-nums N)))
    (princ (winner-of-trick-taking N TT Cn Rn))))

#-swank(main)Code language: Lisp (lisp)
1. D – Trick Taking

2. E – Even Digits(TLE 7)

まずは、素朴に解いてみました。

;; (good-integer-p 2405) ;=> NIL
(defun good-integer-p (n)
  (loop for x = n then (floor x 10) 
        for digit = (mod x 10)
        while (> x 0)
        always (evenp digit)))

;; (nth-good-integer 133) ;-> 2024
(defun nth-good-integer (nth)
  (loop for n from 0 by 2
        with cnt = 0
        when (good-integer-p n)
          do (incf cnt)
        until (= cnt nth)
        finally (return n)))

(defun main ()
  (let ((n (read)))
    (princ (nth-good-integer n))))

#-swank(main)Code language: Lisp (lisp)
2. E – Even Digits(TLE 7)

2.1. 5進数の2倍

この「よい数」は、偶数の5つの数字しか使えないので、実質 5 進数ということになります。

そこで、nを5進数にして2倍にすることにしました。

(defun ary-number-list (n base)
  (nreverse
   (loop for x = n then (floor x base)
        until (zerop x)
        collect (mod x base))))

(defun nth-good-integer/ary (nth)
  (loop for d in (ary-number-list (1- nth) 5)
        with result = 0
        do (setf result (+ (* 10 result) (* 2 d)))
        finally (return result)))

(defun main/ary ()
  (let ((n (read)))
    (princ (nth-good-integer/ary n))))
#-swank(main/ary)Code language: PHP (php)
2.1. 5進数の2倍

これで、無事にクリアできました。

2.1. 5進数の2倍