找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 729|回复: 6

[研讨] 相对大小关系

[复制链接]

已领礼包: 1858个

财富等级: 堆金积玉

发表于 2021-2-10 15:43:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 aimisiyou 于 2021-2-10 15:46 编辑

题目如图。可以看成数值序列相对大小关系(相邻三者)的一种简写。如甲>乙>丙,可用(2 1 0)表示;甲>乙 且乙<丙,可用(1 0 1)表示。
456.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1858个

财富等级: 堆金积玉

 楼主| 发表于 2021-2-10 15:54:55 | 显示全部楼层
本帖最后由 aimisiyou 于 2021-2-10 16:41 编辑

(defun refun (lst1 vvlst)
    (setq vvlst (vl-sort (cons lst1 (vl-remove (assoc (car lst1) vvlst) vvlst)) '(lambda (ea eb) (< (car ea) (car eb)))))
)
(defun tfun(lst)
;;;(setq lst '(3 7 6 2 5 8 4) n (length lst))
(setq n (length lst))
(setq lst (mapcar '(lambda (x y) (if (< x y) 1 (if (= x y) 0 -1))) (reverse (cdr (reverse lst))) (cdr lst)))
(setq i -1  nlst (mapcar '(lambda (x) (setq i (+ 1 i))) (cons 0 lst)))
(setq sum 0 vlst (cons 0 (mapcar '(lambda (x) (setq sum (+ x sum))) lst)))
(setq vvlst (mapcar 'list nlst vlst (cons 0 lst) (mapcar '(lambda (x) (if (< x 0) nil t)) nlst)))
(while (apply 'or (mapcar 'last vvlst))
(setq plst (car (vl-sort (vl-remove nil (mapcar '(lambda (x) (if (last x) x nil)) vvlst))
                  '(lambda (ea eb) (< (cadr ea) (cadr eb))))))
(setq vvlst (refun (list (car plst) 0 -1 nil) vvlst))
(setq klst (assoc (car plst) vvlst))
(setq flag1 t flag2 t llst klst rlst klst)
(while  flag1
  (setq lnlst (assoc (- (car llst) 1) vvlst))
  (if lnlst
      (if (last lnlst)
               (if (= (caddr llst) 1)
                       (setq flag1 nil)
                           (if (= (caddr llst) 0)
                   (setq vvlst (refun (list (car lnlst) (cadr llst) (caddr lnlst) nil) vvlst) llst (assoc (car lnlst) vvlst))
                   (setq vvlst (refun (list (car lnlst) (+ 1 (cadr llst)) (caddr lnlst) nil) vvlst) llst (assoc (car lnlst) vvlst))
                                )
                   )
              (setq flag1 nil)
          )
      (setq flag1 nil)
  )
)
(while  flag2
  (setq rnlst (assoc (+ (car rlst) 1) vvlst))
  (if rnlst
      (if (last rnlst)
               (if (= (caddr rnlst) -1)
                       (setq flag2 nil)
                           (if (= (caddr rnlst) 0)
                   (setq vvlst (refun (list (car rnlst) (cadr rlst) (caddr rnlst) nil) vvlst) rlst (assoc (car rnlst) vvlst))
                   (setq vvlst (refun (list (car rnlst) (+ 1 (cadr rlst)) (caddr rnlst) nil) vvlst) rlst (assoc (car rnlst) vvlst))
                                )
                   )
              (setq flag2 nil)
          )
      (setq flag2 nil)
  )
)
)
(mapcar 'cadr vvlst)
)_$ (tfun '(180 160 100 150 145 142 138 138 138 140))
(2 1 0 3 2 1 0 0 0 1)


故题目结果为  200*10+(2+1+0+3+2+1+0+0+0+1)*100=3000
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1858个

财富等级: 堆金积玉

 楼主| 发表于 2021-2-10 16:29:30 | 显示全部楼层
本帖最后由 aimisiyou 于 2021-2-10 16:33 编辑

找最深的V(底部设为0),向左更新,向右更新;再找余下部分最深的V(底部设为0),向左更新,向右更新;……更新过程中须判断左顶点和右顶点是否已经更新过,更新过就不再处理。
333.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1858个

财富等级: 堆金积玉

 楼主| 发表于 2021-2-11 08:04:28 | 显示全部楼层
采用字符串处理思路先将含有>=<的字符串分解,分解后的每个小字符串对应着数值序列,再将数值序列按规则合并。
_$ (defun ttfun(lst)
(setq strlst (apply 'strcat (mapcar '(lambda (x y) (if (< x y) "<" (if (= x y) "=" ">"))) (reverse (cdr (reverse lst))) (cdr lst))) valst nil)
(defun f1 (strlst)
   (setq str (substr (vl-string-trim "=" strlst) 1 1))
   (if (= str ">")
        (progn
           (setq strlst (vl-string-translate ">=" "10" strlst))
                   (setq nlst (mapcar '(lambda (x) (- x 48)) (vl-string->list strlst)))
                   (setq sum (apply '+ nlst) vlst (cons sum (mapcar '(lambda (x) (setq sum (- sum x))) nlst)))
                )
        (progn
           (setq strlst (vl-string-translate "<=" "10" strlst))
                   (setq nlst (mapcar '(lambda (x) (- x 48)) (vl-string->list strlst)))
                   (setq sum 0 vlst (cons 0 (mapcar '(lambda (x) (setq sum (+ sum x))) nlst)))
                )
   )
   vlst
)
(defun f2 (lst1 lst2)
    (if (= 0 (last lst1) (car lst2))
       (setq vlst (append lst1 (cdr lst2)))
           (if (>= (last lst1) (car lst2))
           (setq vlst (append lst1 (cdr lst2)))
                   (if (= (cadr (reverse lst1)) (last lst1))
               (progn
                                   (setq lst (reverse lst1))
                               (setq m (car lst) i 0)
                                   (setq lst (cdr lst))
                                   (while (= m (car lst))
                                          (setq i (+ 1 i))
                                                  (setq lst (cdr lst))
                                   )
                              (setq vlst (append  (reverse lst) (repeat i (setq lst2 (cons (car lst2) lst2)))))
                                )
               (setq vlst (append (reverse (cdr (reverse lst1))) lst2))
                    )
           )
   )
)
(while (/= strlst "")
   (setq str (substr (vl-string-trim "=" strlst) 1 1))
   (if (= str ">")
       (progn
           (setq n1 (strlen strlst) sslst strlst)
                   (setq strlst (vl-string-left-trim ">=" strlst))
           (setq valst (cons (substr sslst 1 (- n1 (strlen strlst))) valst))
                )
       (progn
           (setq n1 (strlen strlst) sslst strlst)
                   (setq strlst (vl-string-left-trim "<=" strlst))
           (setq valst (cons (substr sslst 1 (- n1 (strlen strlst))) valst))
                )
   )
)
(setq lst (mapcar 'f1 (reverse  valst)) klst (car lst))
(if (cdr lst)
    (foreach ea (cdr lst)
       (setq klst (f2 klst ea))
     )
         (setq klst (car lst))
)
)
TTFUN
_$ (ttfun '(3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4 6 2 6 4 3 3))
(1 0 1 0 1 2 0 2 1 0 1 2 3 0 2 1 0 1 2 0 1 0 2 1 0 0)
_$
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4365个

财富等级: 富可敌国

发表于 2021-2-16 00:05:12 | 显示全部楼层
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 4365个

财富等级: 富可敌国

发表于 2021-2-18 01:28:28 | 显示全部楼层
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 914个

财富等级: 财运亨通

发表于 2021-2-18 12:22:52 | 显示全部楼层
新年快乐,牛年大吉
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-17 07:02 , Processed in 0.353811 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表