Yet Another Permutation Constructive

这道题目不用写,因为必须要求用kotlin语言

讲一下我做这道题目的过程

我最开始正着想,如果k比较大的话,我们就想一次删的数少一点,所以考虑一次操作有哪些数被保留,于是我们发现,原序列的极大值点会被保留,于是一次操作被保留的数最多的情况就是如下的波浪形:

然后我们就发现正着想很难构造了,于是我们就倒着想:

最后一次删完了的序列是这样:[n]

我们考虑倒数第二次删完之后序列长成什么样,我们有个直觉就是越大的数越在后面被删除,于是我们考虑此时剩下的数是n1,也就是说序列此时是这样:[n1,n]

那么对于倒数第三次,为了让上面两个数都不删除,我们必须要在中间插入n2,即[n1,n2,n]

这也就是正着想的时候,我们想要构造波浪形

同理第四次即[n1,n3,n2,n4,n]

在这样一直插入下去;如果说插入了1但是k次操作还没有用完,那么就是无解,否则的话,当k次操作用完的时候,我们将剩余的还没有插入的数,按照[1,2,3,...]这样的顺序放在序列最前面即可

我们的构造方法与官方题解一样,但是官方题解的思路却跟我们完全不一样,但是是对我们的构造方法的严谨证明

update 2024.8.25

我们的构造思路是正难则反;官方题解的构造思路是利用已知构造未知,只不过是从k推到k+1;我重新做也想出来了一个利用已知构造未知,只不过是从n2推到n:先手动构造出n=2n=3的所有情形;假设我们现在要构造(n,k),就先找到(n+12,k1)的构造方法,然后将所有数加上n+12,再在两个数之间依次插入1,2,...,n2。比如说现在要构造(5,3),就先找到(3,2)(有两种情况,不妨设是[2,1,3]),然后所有数加上2变成[4,3,5],然后插入1变成[4,1,3,5],再插入2变成[4,1,3,2,5];不难证明上述方法的正确性。所以以后利用已知构造未知可以一步一步地构造(kk+1),也可以一半一半地构造(n2n

posted @   最爱丁珰  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示