Ural 1568

题意:
你有一个排列A,你想要用最少的操作将其排序,每次操作,你可以选择A中的一个子序列(可以不连续),将其放到前面去。
比如,A={5,1,2,4,3},你可以选择子序列{1,2,3}放到前面,这样A={1,2,3,5,4}

我的做法:
我们每次操作会将数组分成两个部分——放到前面的和位置不变的。
首先有一个显然的贪心,如果数x已经出现在数(x+1)的前面,那么我们后续操作不会将它们放到不同的部分中了。
比如A={5,1,2,4,3},那么子序列{1,2,3},在后面的操作中,要么同时放在前面,要么同时保持位置不变。

那么我们处理出当前的连续子序列,并将其缩成一个点,并由小到大排序,比如A={5,1,2,4,3},那么划分出的子序列有3个——从小到大依次为{1,2,3},{4},{5}。如果当前有m个点,那么我们一次操作可以将相邻的两个点合并,由于我们可以同时合并多组点(但是一个点在一次操作只能被合并一次),所以一次操作,我们会减少m2个点。模拟这个过程,直到m=1,就将数组排好序了。

举个例子,比如样例26,5,2,4,1,3,当前有(1),(2,3),(4),(5),(6)m=5个点,第一次我们合并成(1,2,3),(4,5),(6),第二次我们合并成(1,2,3,4,5),(6),第三次合并成(1,2,3,4,5,6),我们就排好序了。其对应的数组为(6,5,2,4,1,3)(4,1,6,5,2,3)(1,2,3,4,6,5)(1,2,3,4,5,6)

还有从另一个方向考虑的想法:

posted @   Nastia  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示