后面什么也没有 vb_选考VB算法解析之2021年1月选考技术真题卷第16题

本篇博客主要解析2021年1月选考技术真题卷中第16题,该题涉及分段数组、自定义函数及顺序查找算法。题目要求学生掌握自定义函数调用和数组操作,通过独立解题与对比参考答案,探讨解题思路和方法,鼓励读者交流讨论,共同进步。
摘要由CSDN通过智能技术生成
52ef158848e4ccde6506c19587bae6df.png 说在前面

虽然考前对真题卷的预测是回归基础,难度不会太大,但是第16题的命题思路还是有些出乎我的意料——没想到题目会出得这么简单,和平时的考试卷简直是天壤之别。看来这是高层对平时联考卷、模拟卷试题过难过繁的一次强有力纠偏,让师生在复习教学时进一步回归基础,利用常见算法思想和基本数组操作解决实际问题,注重培养学生理解问题和解决问题的能力,而不是一味的记套路、套模板。

2021年1月选考技术真题卷第16题

一题目

d487248c5477daeae475ebf0ab29ab74.png5ebe220be8d07c87236b076fbd9a33ba.png0bd3dc6d9f4218985546bae223e8fd1e.png

二考查知识点

分段数组、自定义函数、顺序查找算法,要求学生掌握自定义函数的调用方法,熟悉定位分段数组左右边界的方法和顺序查找的基本算法思想。

三解析 本题背景信息虽然比较复杂,但是描述准确,示例清晰,算法直接模拟了放置物品的过程,没有使用某些特定的复杂算法,代码长度适中,注释详细,应该算得上简明易懂。唯一的难点在于变量过多,考生需要在正确理解题意的基础上,充分利用代码注释,理解关键变量的含义,才能正确解题。 要准确回答第一题,需要理解“在空区域中居中连续放置同组物品”的含义。每层总共10个格子,先居中放置第1组的6个物品,占据3-8号格子,左右两侧各剩余2个空格。故第2组的2个物品刚好可以放在1、2号位置。 题目使用了2个数组,其中a(i)表示第i组物品的数量,f(i)表示从位置i开始的同层连续空格数量。 第①空的突破口在于理解变量p的含义,结合后面的选择语句和前面的getpos函数,可以知道p表示a(i)对应空区域的起始编号,若不能连续放置a(i)个物品,则p=-1。故第①空答案为getpos(a(i))。 第②空所在代码段的功能是遍历所有格子,将第i组物品零散放置到空格中,其中变量v表示格子下标,j用来计数,故答案为:v = v + 1。当然也可以利用getpos函数,写作v= getpos(1),但这样与前面的判断语句If f(v) <> 0 Then重复,也没有利用v递增的特点,效率较低。 第③空是遍历放置了第i组物品的格子位置,更新其f(j)值为0。此处有两个地方容易出错,一是没有注意到p的值已经增大,把答案误写为p + k To p + k + a(i) – 1;二是使用该行右侧空格的数量来定位j的右边界,但没有考虑到左右两侧剩余的空格不一定相等,以为右侧空格的数量也是k,把答案误写为p To ((p - 1) \ w + 1) * w – k。 我们可以根据k = (f(p) - a(i)) \ 2得知变量k 表示居中连续放置第i组物品后,其左侧剩余的连续空格数量,当(f(p) - a(i))为偶数时左右两侧剩余空格数量相同,但若其为奇数,则右侧比左侧多一个空格。 因此第③空正确答案为:p To p + a(i) – 1。 我们也可以采用为代码添加注释的方式分析如下: 849386e4255105fdb46a904ffd432870.png答案

11ce87c2c3d4ab7e2d3b365c4150f540.png

拓展思考     题目使用模拟算法直接模拟了放置物品的过程,不需要排序,也没有考查对分查找,就是简简单单、平平淡淡地解决了一个放置物品的问题。为了帮助考生快速理解题意,命题老师还贴心地给出了样例示意图和大量代码注释,大大降低了解题难度。 对题目本身我没有太多想法,更大的触动在于今后复习和模拟卷命题的方向,肯定是越来越回归基础,越来越强调对题目背景和算法逻辑的分析,不需要记住特定的套路和花样繁多的代码模式,只需要正确理解题意,使用最基本的语句模拟算法过程,就能得分。 命题老师为了减少学生的阅读量,特意省略了getpos函数的代码,其实这段代码难度也不大,就让我们把它作为拓展思考的练习,把代码补充完整吧:

'按格子编号从小到大的次序,查找空格子数>=r的第一个空区域

'若找到,返回该空区域的起始编号,否则返回-1

Function getpos(r As Integer) As Integer

    '请把代码补充完整

End Function

拓展思考答案

 Dim i As Integer

    getpos = -1

    For i = 1 To m

        If f(i) >= r Then

            getpos = i

            Exit Function

        End If

    Next i

写在后面

为了保证解析的原创性和思维的独特性,我都是独立解题后,先不看答案(除非题目不会做),直接把解析写好,再去看答案。

当然,如果发现参考答案有更好的思路,我还是很乐于学习和借鉴的。同时,由于本人水平有限,解析中难免出现疏漏甚至错误之处,敬请谅解。

无论是赞同还是反对我的看法,都请你给我留言。如果你有新的想法,千万不要憋在心里,请发出来大家一起讨论。让我们相互学习,共同进步!

需要本文word版的,可以加入“选考VB算法解析”知识星球参与讨论和下载文件,“选考VB算法解析”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。

我们专注选考VB算法,感兴趣就一起来!

163c12baed884923f7b849fb4e227666.png

相关优秀文章:

阅读代码和写更好的代码

最有效的学习方式

选考VB算法分析文章分类

104b9dce6df8717d6862fb9d94b1b694.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值