【发布时间】:2014-10-19 19:37:41
【问题描述】:
我现在很困惑。请注意,这场斗争已经教会了我很多关于 lisp 的知识。不过,此时我可能需要一点推动或指导。
给你 N 根棍子,每根棍子的长度都是正整数。对木棍执行切割操作,使所有木棍都减去最小木棍的长度。
假设我们有 6 根长度的棍子
5 4 4 2 2 8 然后在一次切割操作中,我们从 6 根棍子中的每一根切出长度为 2 的片段。对于下一次切割操作,剩下 4 根棍子(长度非零),长度为
3 2 2 6 重复上述步骤,直到没有留下任何棍子。
给定 N 根棍子的长度,打印在后续切割操作中切割的棍子数。
输入格式 第一行包含一个整数 N。 下一行包含 N 个整数:a0, a1,...aN-1,以空格分隔,其中 ai 表示第 i 根棍子的长度。
输出格式 对于每个操作,分别打印被切割的棒数。
约束 1≤N≤1000 1 ≤ ai ≤ 1000
所以我得到了所有示例测试用例,但其他一些我没有。例如
输入:
8
8 8 14 10 3 5 14 12
他们期望输出为
8
7
6
4
3
2
但是我的代码给出了
8
7
6
4
2
这是我现在想出的功能。
(defun cut-print (numbers cut-length)
(let ((x numbers) (y cut-length) (k 0))
(loop while (> (length x) 0) do
(tagbody
;; subtracting the min value from all list elements
(setq x (map 'list (lambda (i) (- i y)) x))
;; Don't print if the list length hasn't changed
;; from last iteration
;; else save length changes and print
(cond ((= k (length x)) (go bottom))
((not (= k (length x)))
(setq k (length x))
(format t "~d~%" k)))
;; move to here if nothing is printed to
;; stdout during the current iteration
bottom
(setq x (remove-if (lambda (x) (<= x 0)) x))))))
我忽略了什么?根据测试用例,上面的逻辑似乎会根据预期的输出跳过剪切操作。
【问题讨论】:
标签: algorithm lisp common-lisp