2019CCF非专业级别软件能力认证第一轮
(CSP-J)入门级参考答案
一、单项选择题(共15题,每题2分,共计30分)
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
A | D | C | A | A | D | C | C | B | C |
11 | 12 | 13 | 14 | 15 |
| ||||
C | A | C | B | A |
|
二、阅读程序(除特殊说明外,判断题1.5分,单选题3分,共计40分)
第1题 | 判断题(填√或×) | 单选题 | ||||
1) | 2) | 3) | 4) | 5) | 6) | |
× | √ | × | √ | B | B | |
第2题 | 判断题(填√或×) | 单选题 | ||||
1) | 2) | 3) | 4) | 5) | 6) | |
√ | × | × | × | A | A | |
第3题 | 判断题(填√或×) | 单选题 | ||||
1) | 2) | 3) | 4) | 5) | 6)(4分) | |
× | √ | A | D | D | B |
三、完善程序(单选题,每小题3分,共计30分)
第1题 | 第2题 | ||||||||
1) | 2) | 3) | 4) | 5) | 1) | 2) | 3) | 4) | 5) |
C | D | B | B | B | B | D | C | A | B |
2019 CSP-J 第一轮 答案解析
一、单选题答案解析
- .cn:中国的顶级域名是 .cn,概念性知识,但大家注册的时候其实对这个后缀非常熟悉了,rg.noi.cn
- 01 0010 1000 0011:与运算是有 0 就为 0,都是 1 才是 1。
- 1 Byte = 8 bits
- s=a-c:过去考过类似的,既然是做了 c 次 -1,自然等价于 -c。
- 7 :二分折半查找 2^6<100<2^7
- 可随意访问任一元素:链表要访问到某个元素,必须一个个找过去。
- 18:我们保证放法升序就能没有遗漏枚举了,实际考场中采用此方法是最稳妥的,可以避免推错。8,17,26,35,44,116,125,134,224,233,1115....当然从这里我们也能发现递推方程。
- 15:非常良心的考了原题,跟坐标是1,往右依次就是 3、7、15
- 97:这个就没啥说的了。。
- 29:如果辗转相除啥的可能会比较麻烦,最简单的方式就是验证一下四个选项是否除得尽。
- 2400:阅读理解题,做法就按照说法来跑就好。
- 4:抽屉原理,最坏情况就是最平均的情况,123412341234,还有一张必然会构成4。
- 75:xyzyx 模式,其中 z 必须是(0,1,8)中的一个,y必须是(0,1,8,6,9)中的一个,前面是 6 后面就是 9,x 同 y,所以乘法原理后就是,3*5*5=75
- ABDEGHJCFI:经典的内容,在后序遍历找根然后在中序遍历划分左右子树即可。
- 图灵奖:看哪一个笨蛋还选错这样的题
二 、阅读程序
(1)
- x:输入的字符并没有什么限制。
- √:我们下面索引用到了 i-1
- x:在 i>sqrt(n) 时也是存在因子的
- √:这个程序在做的就是特定位置小写转大写。
- 6:只有 18 的因子的位置会被判断是否需要转换,共 6 个
- 100000:验证每个选项,发现另外三个因子数明显没有36
(2)
非常绕的一道题,也是让大家叫苦连天的题。到底在做什么呢?很快能发现 a 与 b 数组在做的是建立 x~y 的链接,设置的时候也是对称设置的。
如果 x 原来对应的 a[x] 比新的 y 小,并且 y 原来对应的 b[y] 比新的 x 小,那么把原来的对应关系清空,建立新的关系。
- √:只要有关系来,不管会不会覆盖,至少不会关系全空。
- x:看上去是对称的,但是因为有可能 x=1 对应着 y=2,那么做到 i==1 时 a[1]==2,b[1]==0;
- x:如果我们建立了 2~3 与 3~2 两组关系明显就可以了。
- x:15 行是在清楚原来 x 所对应的关系,和题目表述没啥联系。
- 2n-2m:此时不会发生覆盖的情况,每组链接都被做了。
- 2n-2:最后只会保留一组关系
(3)
经验丰富的同学会看出来,这里就是在建立一颗树,每次找到当前区间最小值的位置作为根,然后划分左右做下一层。
最后的返回值非常重要,返回的是左边的值+右边的值+深度*当前根权值,其实就是根节点权值为1,后续按照深度定权值
- x:题目中找最小值有多个相等的话是随便选一个,不会有问题的
- √:b数组是每个点的 value,a 数组是每个点的 key,最后计算是计算value*depth,所以b数组全 0 结果就是全 0
- 5000:每一层都要做一次,最坏情况下是一开始有序,每次都是第一个是根,所以要做 100 层,第一次 100 次,每层次数 -1,1+2+3+...+100 = 5050
- 600:最好情况下就是每次都二分,层数应该是 log2(100),也就是6左右。此时每层都差不多100个(后面随着有的点做了根会略少)。
- 385:最坏情况就是1*1+2*2+3*3....,手算一下,很快发现选择385.
- 580:最好情况就是刚好每次都二分,那么 100 个节点的每层节点数量就是 (1,2,4,8,16,32,37)分别乘对应权值即可 1+4+12+32+80+192+259
三 、完善程序
(1)
这题很明显是利用递归填好每个的位置,从最大的开始递归往下做。
- t:x,y指当前的矩阵左上角,n是多少阶,那么t自然就是当前是 0 还是 1 了。
- x,y:左上角矩阵
- x+step,y+step:第二个是右上,第三个是左下,那么剩下的自然是右下了。
- n,0:一开始的时候是 n 阶,0 为特征做下去。
- 1<<n:最终大小自然是 2 的 n 次幂,这边复合的就是位运算的方式的结果。
(2)
题目其实提示的非常充分了,空还是很好填的
- ++cnt[b[i]]:题目说了,先按照b排序,那么自然是用b数组做关键字。
- ord[--cnt[b[i]]] = i:理解这里最重要的是搞懂 18~19 行的内容, 18~19 行在处理我们上限范围内的前缀和,而其实本质上就是每个人的排名了。所以这边我们的cnt[b[i]]就是排名了,后续就很好理解了。
- ++cnt[a[i]]:现在做a,同样的方式即可。
- res[--cnt[a[ord[i]]]] = ord[i]:同上,此时我们采用 res 数组来处理最终结果。
- a[res[i]],b[res[i]]:输出最终顺序的 a 与 b。