2019 CSP-S / NOIP提高组初赛试题解析 (下)

二、阅读程序

1.

 

 程序分析: 本段程序的目的是找到每个a[i]之后第一个大于a[i]的位置(下标ans+1)。代码简单,即使看不懂也可以代入几个数字去试验,毕竟选择题。

1) 第16行输出ans时,ans的值一定大于i。( )

解析:错。只要14行while循环不执行,则ans=i,如n=1,则ans等于i。

2) 程序输出的ans小于等于n。( )

解析:对。ans初始值为i小于n,且小于n是其自增的一个条件,显然不会超过。

3) 若将第12行的“<”改为“!=”,程序输出的结果不会改变。( )

解析: 对。改成!=只是增加了一些没意义的比较,对结果没有影响。

4) 当程序执行到第16行时,若ans-i>2,则a[i+1]≦a[i]。( )

解析:对。因为ans+1是第一个大于a[i]的位置,所以从a[i+1]至a[ans]都是小于等于a[i]的。

5) 若输入的a数组是一个严格单调递增的数列,此程序的时间复杂度是( )。A.O(logn) B.O(n^2)C.O(nlog n) D. O(n)

解析:D。严格单调递增则14行必定不执行,while循环每次只执行一次,时间复杂度为n。

6) 最坏情况下,此程序的时间复杂度是( )。A. O(n^2) B. O(logn)C. O(n) D. O(nlog n)

解析:A。最坏的情况为严格单调递减,14行if判断每次都执行,while循环每次都查找到n,时间复杂度为n+(n-1)+……+2+1=n*(n+1)/2,即O(n^2)。

2、

 

 程序分析: 本题就是一个并查集操作,getRoot函数是查询根节点,循环中对集合进行合并。

1) 输入的a和b值应在[0,n-1]的范围内。( )

解析:对。输入的a、b是集合的下标,自然应该在[0,n-1]之间。

2) 第16行改成“fa[i]=0;”, 不影响程序运行结果。( )

解析:错。未合并前初始根节点是其本身,为0显然不符合题意。

3) 若输入的a和b值均在[0, n-1]的范围内,则对于任意0≤i<n,都有0≤fa[i]<n。( 

解析: 对。fa[i]是根节点,不管在怎么合并,根节点必然也是在[0,n-1]之间。

4) 若输入的a和b值均在[0,n-1]的范围内,则对于任意0≤i<n,都有1≤cnt[i] ≤n。

解析:错。cnt[i]是合并之后集合的元素个数,严谨的并查集操作cnt[i]是不会超过n的,但是本题没有判断是否重复合并。所以如果先输入(1,2),(3,4),之后一直不断输入(2,4),最后cnt[4]会超过n。

5) 当n等于50时,若a、b的值都在[0,49]的范围内,且在第25行时x总是不等于y,那么输出为( )。
A.1276 B.1176 C.1225 D.1250
解析:C。本题前提下cnt[i]表示当前集合的元素个数,每次执行都是两个集合合并,我们可令每次都是单个集合合并进入大集合,ans=1*1+1*2+1*3+……1*48+1*49=49*(49+1)/2=1225。
 
 
6) 此程序的时间复杂度是( )。A. O(n) B. O(logn) C. O(n^2) D. O(nlogn)
解析:C。getRoot是依次查找上一个父元素,没有“压缩路径”,时间复杂度最差为n,所以总的时间复杂度为n^2。
 
 
3、

 

 

 

 程序分析: 本题主要需了解两个数组的含义,pre[i]表示s[0..i]至多可以从前往后匹配到t串的哪一个字符,此时t[0..pre[i]-1]是s[0..i]的子序列。sub[i]用于记录s[i..slen-1]至多从后到前匹配到t的哪一个字符,此时t[suf[i]+1..tlen-1]是s[i..slen-1]的子序列。本题是求s中连续删除至多几个字母后,t仍然是s的子序列。

1) 程序输出时,suf数组满足:对任意0≤i<slen,suf[i] ≤suf[i+1]。( )

解析:对。从15至19行可以看出,sub数组的值是从尾部往前减小或不变,所以suf[i] ≤suf[i+1]。

2) 当t是s的子序列时,输出一定不为0。( )
解析:错。有题目目的可知,当t==s时输出为0。
3) 程序运行到第23行时,“j-i-1”一定不小于0( )
解析: 错。若第一循环时while不执行,则j-i-1为-1,如s=”bacb”,t=”ac”。
4) 当t是s的子序列时,pre数组和suf数组满足:对任意0≤i<slen,pre[i]>suf[i+1]+1( )
解析:错。由含义可知若t是s子序列,t[0..pre[i]-1],t[sub[i+1]+1..lent-1]是s[0..i],s[i+1..lens-1]的子序列,不会重叠,即pre[i]-1< sub[i+1]+1,即pre[i] <= sub[i+1]+1。
5) 若tlen=10,输出为0,则slen最小为( )。A. 10 B. 12C.0 D.1
解析:D。若t不是s子串(或t==s)输出都为0,但为保证程序执行,最少应输入一个字符。
6) 若tlen=10,输出为2,则slen最小为( )。A.0 B.10C.12 D.1
解析:C。输出为2说明slen最多连续删除2个后为10,所以最小为12。
 
三、完善程序
 
Ps:程序完善提不贴题目了,请自己去看原卷。
1.程序分析: 程序每次都先学习一个已经达到条件但为学习的技能,学习后更新经验值和其他技能与该技能有关的学习条件,不断重复至没有技能可以学。unlock数组为对应技能需学习的前置技能数,大于0说明有前置技能要学,为-1表示已学习。
1) ①处应填( )A. unlock[i]<=0B. unlock[i]>=0C. unlock[i]==0D. unlock[i]==-1
解析:C。学习技能条件一,需要的前置技能数为0且为学习。
2) ②处应填( )A. threshold[i]>pointsB. threshold[i]>=pointsC. points>threshold[i]D. points>=threshold[i]
解析:D。学习技能条件二,总经验达到该技能的经验要求。
3) ③处应填( )A. target = -1B. --cnt[target]C. bbonus[target]D. points += bonus[target]
解析:D。技能学习后总经验增加。
4) ④处应填( )A. cnt [child[target][i]] -=1B. cnt [child[target][i]] =0C. unlock[child[target][i]] -= 1D. unlock[child[target][i]] =0
解析:D。即使看不懂,也应该猜到是学完技能后,相关技能的前置条件-1。
5) ⑤处应填( )A. unlock[i] = cnt[i]B. unlock[i] =mC. unlock[i] = 0D. unlock[i] =-1
解析:B。定义每个技能学习需要的前置技能数。
 
2.请自己去看原卷。
程序分析:通常我们可以设置bool数字f[i]表示有i个石子时有无先手必赢策略。若对于i个石子有先手必赢策略,则存在j(a[j]<=i且b[j]<=i)使得i-b[j]个石子先手无必赢策略,则得到转移方程f[i]=OR{!f[i-b[j]} (a[j]<=i且b[j]<=i)。因为本题策略数和数组b数字都不超过64,所以仅考虑f[i-1]..f[i-64],可将其状态压缩至一个64位数中。其中status用于记录对于i个石子,i-1..i-64是否有先手必胜策略。
1)①处应填( )
A.0      B .~0ull           C.~0ull^1         D.1
解析:C。根据题目要求,状态压缩到64位,A和D默认是32位整数,所以B或者C。最开始石子是0个,应该是输的状态,所以最低位不能是1,选C。
2)处应填( )
A.a[j]< i        B.a[j]==i          C.a[j] !=i       D.a[j] >i
解析:B。题目实现有将规则按a[i]进行从小到大排序,所以可使用规则只增加不减少。此循环用于增加当前可选的规则,当i达到a[j]时规则可以使用。
3)③处应填( )
A. trans |= 1ull <<(b[j] - 1)           B. status |= 1ull << (b[j]- 1)           C. status += 1ull << (b[j]-1)        D. trans += 1ull<< (b[j]-1)
解析:A。此行是用来在原有规则上,新增”取b[j]个棋子”的规则。二进制新增用|。
4)④处应填( )
A. ~status|trans             B. status&trans       B. status|trans       D. ~status&trans
解析:D。
5)⑤处应填( )
A. trans = status | trans ^win       B. status = trans >> 1^win            C. trans = status ^trans |win          D. status =status <<1^win
解析:D。
 

NOIP信息学视频地址

视频地址

链接:https://pan.baidu.com/s/1tHo1DFMaDuMZAemNH60dmw 
提取码:7jgr

 
posted @ 2020-10-14 10:41  tianli3151  阅读(1328)  评论(0编辑  收藏  举报