感想&提醒
查看原帖
感想&提醒
929850
Chenyufeng040525楼主2025/5/2 21:38

先放个我的和官方的最优通过记录

我的记录

官方的记录

感想

可以看到我在任务4,5,6上都做了相关的优化,将官方最优解的花费进一步缩小。其中任务4的优化最难,需要将官方方案中无用的赶路部分去掉以及进行相关调整,所以解决方法比较难想。

任务5,6的c1和官方最优解留有冗余,只要你能按照题解的思路模拟思考一遍,再耐心把相关操作代码打出来就基本能在c1标准内通过。

其中任务5的优化比较简单,所以比官方最优差不了多少。任务6留有的冗余较多,大概是官方的仁慈,又或者是懒得优化了。只要你把操作设置的比较方正,空白区留的少,就能远远满足c1标准通过。

这道题我做了两天,任务1还能独立完成,但任务2,3的c1标准是真恶心,同时也让我认识到了 “负数以及大于/小于等于之间差1” 的神奇妙用,这也为我对任务4,5,6进行优化打下基础。

任务4,5,6基本是在官方题解的帮助下进行的,至于优化就是想在 “抄袭思路” 的情况下能不能做出些 “创新”,事实上也做到了。

发这个讨论是因为我看到本题除了官方外就没人通过,自己也算是第一个通过本题的人,所以就当是给后面要做这个题的人一些建议。

对于前4个任务,你不会就照着官方题解的图片把操作一个个打出来,对于任务5,6也只是让你在理解官方思考的情况下,把缺的部分自己补全。要补全的部分也是题解中有的部分,只需要你改些数字而已。

最后做这题最重要的就是细心和耐心,毕竟是让你做翻译代码为机器操作的事,很多重复部分需要你合理利用工具进行生成,最后再在官方提供的toy工具进行调试。

我做这题就是先在纸上将需要的组件部分分别写出来,再进行拼合,然后再对着纸上将操作按每行打出来,方便调整。在纸上可以将操作都用字母代号表示,然后做好映射表,方便将操作里的字母代号都转为数字。

由于本题的题解没有给相关的答案文件,所以只是想抄题解过的人可以放弃这个想法了。

提醒

这个部分是给出我对于优化任务4,5,6的一些思考,不会直接给出方法,所以只能算是一个提醒,如果你正确通过本题以后可以来看看这个部分。

首先最简单的任务5,我们可以注意到官方是把循环部分放在外面绕了一圈,如果我们不绕这一圈应该如何操作呢?

然后是任务6,这个的唯一难点就是写出来,只要你能按官方思路写出来就基本是在c1标准以内。主要是官方给出的 n=4 部分也太乱了,都没有好好对齐,其中就有大量空白位置没有合理用到。所以我能给出的最有意义的优化就是让你操作部分先保持方正,进一步优化需要你能对自己写的有足够认识才有可能优化。由于这题是最难的,涉及大量的指路部分,所以优化空间非常大,我也不能保证自己的就是最优的。

最后就是任务4,也是我最后写的,足足花了一天。难点不是写出来,写出来只要照着官方题解打就行了,难的是优化,所以这一个部分的优化思路会写的很多。

首先考虑能否优化,注意到比官方的 5 * 7 矩阵要小的还比较合理的是 4 * 8 矩阵,同时注意到官方的操作有3个位置是无用的,所以我们可以假设还能优化。

注意到官方的主体部分是4个,一个是比大小,一个是求2的幂,一个是结果处理1,还有一个是对处理1进行再处理的处理2。四个主体部分都可以变成 2 * 2 或是 2 * 3 的矩阵,正好可以塞在 4 * 8 的矩阵内,可以进一步思考其的可操作性。

官方的操作中,是从比大小 -> 求幂次 -> 处理1 -> 处理2的一整个循环。其中处理2分为两个判断语句决定是否进行一个处理1的再处理操作。处理2分为两个部分似乎太占空间了,是否可以简化为一个部分。然后每次比大小开头都有一个清空操作,如果要去掉是否可行,又应该如何操作。

可以看到上面两个思考都和节省空间有关,那么我们这么急切的节省空间有什么用。注意到从开始到现在我们还没有讨论输出和输入的位置,如果要放是不是应该放在哪里合适呢。

还需要大家注意的是求幂次的操作能否帮忙承接我们可能要省去的部分操作。以及处理1结束后我们能得到什么信息,这些信息会不会帮助我们简化一部分的判断流程。以及我认为的点睛之笔,如果我们已经进行了比大小的操作得知不能交换,但由于行数的限制如何在必须经过交换部分之前做好不会交换的准备。

至此所有的提醒已经结束,可能发现读完这部分的你还是一头雾水的。因为我也不觉得会有人在能通过本题以后还会像我一样想进一步优化,所以上面的这些提醒也只是泛泛而谈。

当然我也期待能有人比我优化得更好,如果你想找我聊聊你的优化思路我也非常欢迎。

2025/5/2 21:38
加载中...