【第二十四届全国青少年信息学奥林匹克联赛】NOIP2018普及组初赛试题解析(C++语言)

选择题

1.D 【解析】打印机属于输出设备,它将一些信息通过打印机打印出来。扫描仪,键盘,鼠标属于输入设备。
2.D 【解析】 A,B,C选项的十进制数值都是617617,D选项的数值是619619
3.D 【解析】 1MB=1024KB=1024×1024B1MB=1024KB=1024×1024B
4.B 【解析】 广域网的缩写是WANWAN,局域网是LANLAN,城域网是MANMAN
5.B 【解析】 常识,要对信息学竞赛的背景有所了解。背景:1984年邓小平指出:“计算机的普及要从娃娃做起。”中国计算机学会于1984年创办全国青少年计算机程序设计竞赛(简 称:NOI),当年参加竞赛的有8000多人。
6.A 【解析】首先我们要知道CapsLock是键盘上用于切换大小写得键。例如,你们来输入的是小写的a,如果你按了CapsLock键,输出的就是大写的AA。模拟题目中的规矩,可以得到循环:ASDFasdf(A,S,D,F,a,s,d,f)。其中每八个字母一个循环。81mod8=181 mod 8=1,那么输出的就是循环节的第一个字符AA
7.A 【解析】 节点总数为:kk0++kk1++++kkh,接下来的问题就是如何化简这个等比数列了。设S=kS=k0++kk1++++kkh,则kS=kkS=k1++kk2++++kk3kSS=S(k1)=kkS-S=S(k-1)=kh+11-1,化简一下就是S=kS=(kh+11/k1-1)/(k-1)
8.A 【解析】 基数排序是根据每一个数位的大小进行排序的,类似于桶排序的思想。而冒泡排序,堆排序和直接插入排序都是基于比较的。
9.A 【解析】我们可以选用递推的方法,设f[i]为i个数比大小的最小次数,f[i]=f[i2]+3,f[1]=0,f[2]=1f[i]=f[i-2]+3,f[1]=0,f[2]=1。含义就是对于每一组数,取两个数比大小要11次,对于剩下的i2i-2个数要f[i2]f[i-2]次,一次最大,一次最小,所以要f[i2]+1+2=f[i2]+3f[i-2]+1+2=f[i-2]+3次,n=3-10的数据分别是3,4,6,7,9,10,12,133,4,6,7,9,10,12,13,带入得A (好吧我也不是特别会)
10.B【解析】NOIP原题,不断的出现重复和递归的结构十分相似。
11.A【解析】画图,略。
12.B【解析】对于我们所要求的S,相当于一个1010位的二进制位,11表示取,00表示不取,则共有2210=256=256种方案,或者暴力一点,C(0,10)+C(1,10)+C(2,10)+...+C(10,10)=1024C(0,10)+C(1,10)+C(2,10)+...+C(10,10)=1024,显然这两种方法都是可行的;对于T,显然是10选7的组合数,即C(7,10)=120C(7,10)=120,那么T/S=120/1024=15/128T/S=120/1024=15/128,选择答案B。
13.B【解析】求10000的欧拉函数,根据唯一分解定理,10000=210000=245*54,那么就可以直接根据公式,φ(10000)=10000×(11/2)×(11/5)=4000φ(10000)=10000×(1-1/2)×(1-1/5)=4000。
14.B【解析】树状数组lowbitlowbit运算,求二进制位有多少个11。当然考场上最简单的方法莫过于带一个数进去了,算完后就知道ACD算不出答案。
15.B【解析】结构类似于桶,先进后出,属于数据结构栈。


问题求解

第一题.去了 没去 没去 没下雨
【解析】
从中我们知道一个规律,如果ABAB都成立那么CC成立,若C不成立,A和B中有一个成立的时候另一个便不成立。
因为丙去了,根据已知可知丁不去。
根据,如果丁和甲同时不去,说明丙也不能去,而因为丁去了,只有让甲去丙才能不去。
根据,如果乙去则丁去,当丁没去说明乙也没有去。
根据,如果下雨且乙不去那么甲也不去,而乙去了,甲却没去,说明没有下雨。
我们要根据已知去推,这也是一道比较简单的逻辑题了。
第二题.544544
【解析】
我们从位数去考虑。
1位数:11个。只有一个数字88.
2位数:如果十位1,2,3,4,5,6,7,91,2,3,4,5,6,7,9,那么有88个(后面都接上1位的方案数);如果十位是88,则有1010个数字(88后接任意数组均可)。共有8+10=188+10=18(个)
3位数:如果百位1,2,3,4,5,6,7,91,2,3,4,5,6,7,9,那么有面可以跟个位有数字88的(如108108),也可以跟十位有数组88的(如188188),共8×(1+18)=1528×(1+18)=152种;若百位是88,有100100种方案。共有152+100=252152+100=252(个)
4位数:11开头有1+18+252=2711+18+252=271(个);22开头有2008,20182008,2018,共22个;共有271+2=273271+2=273个。
共计:1+18+252+273=5441+18+252+273=544(个)


阅读程序写结果

1.RuanHuoMianTaiRuanHuoMianTai
【解析】程序的左右是扫描字符串的每一个字符,使得每一个大写字母ASC码+1,或者变成刚刚比它大1(或后面)的大写字母。
2.44
【解析】程序的作用是从1-14种寻着是否存在数i,使得ii2 mod15=1mod 15=1(或ii2 %15=115=1),通过手动计算不难发现满足条件的数字是1,4,6,141,4,6,14;共计44个数,因此答案是44
3.88
【解析】这是一道递归的计算题,如果直接这么做显然显得麻烦了。因此我们可以通过画二维表的方式来求解这个答案。
T3
对于第0行,其大小为该纵座标。
对于第0列,其大小为该横座标对于3取模的值。
对于任何一个非0座标,其大小为上面的数值加上左上角的数值减去左边的数值。
我们可以采用递推的方法解决。
4.66
【解析】这道题就是一个模拟链表的过程,查找有多少个联通快。仔细模拟,发现是6个。


完善程序

1.最大公约数之和 答案:i * i; n/i; return a; a%b; ans+gcd(a[i],b[i])
【解析】 题目的过程就是先找到所有的因数,再进行累加。
我们首先看第一段,有一个函数的名称叫做getDivisor,其实就是求解每一个n的因子。
依照题意,时间复杂度是(Osqrt(n)),那么我们在每一因子i的时候就是1-sqrt(n)这个区间来枚举的。对于最大情况,只有i * i=n,超过就不满足时间复杂度和枚举的要求了,因此第一空所填的就是i * i。当枚举的时候如果这个数是i的因子那么就接着统计。以36为例,i是从1-6来枚举的,如果枚举到2,那么因子18就是通过36/2,或者是n/i来得到;特别的,当i=6的时候,不需要操作,此时n=i*i,即n/i=i时不需要进行操作,所有第二空所填的是n/i。需要注意,尽管使用sqrt函数仍然属于等价写法,但是程序中并没有加载cmath库,因此这么写是错误的。
再看求去最大公因数的过程gcd,这就是一个模拟辗转相除法的过程。复杂度是O(logMAXAB)级别的,因此不要写成是辗转相减法。如果余数是0就返回a,那么第三空就是return a;否则继续取模,因此第四空是a%b。
接下来就是累加答案,累加每一个质因子即可,存在ans上面。因此第五空是ans+gcd(a[i],a[j])。
2.链表 答案:a[x]=i;i+1;R[a[i]];a[i];R[i]
【解析1】套路法(分数8-14)
空1:唯一可行的两个答案a[i]=x和a[x]=i,若是前者可直接cin>>a[i]代替,故答案为后者。
空2:L是i-1,那么R是指向右节点的,上下符号相反,必然是i+1
空3/4:上下文对称,L和R恰好反一下。例如第一句是L[R[a[i]]]=L[a[i]];第二句是R[L[a[i]]]=R[a[i]],根据双向链表的对称性很容易得到答案。
空5:套中套,很多人想到的是R[a[i]],符合上文的结构,但是阴险的出题人一定会在最后一个空坑你一把,只让你输出最简单的R[i],你也可以考试的时候推一下。
【解析2】理解算法含义
第一空是标记每一个x出现的位置;
第二空双向链表R指向后面的元素,即i+1;
三四空是用于删除元素,这是链表最基本的删除操作,可以自行理解数据结构的实现;
第五空主要是输出每一个元素的答案,但是要按照输入的顺序进行输出因此要R[i]而不是R[a[i]],否则就按照了大小的顺序输出了。


试题答案

noip2018pjans

本人预估浙江分数线85上下
(不要14年那么恐怖就好)
浙江学子依旧生活在水深火热之中…
能在考场上拿到90分已经是很满意了。
若有疏忽或者意见望大家指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章