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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ronaldo7_ZYB/article/details/83098444

选择题

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


问题求解

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


阅读程序写结果

1. R u a n H u o M i a n T a i RuanHuoMianTai
【解析】程序的左右是扫描字符串的每一个字符,使得每一个大写字母ASC码+1,或者变成刚刚比它大1(或后面)的大写字母。
2. 4 4
【解析】程序的作用是从1-14种寻着是否存在数i,使得 i i 2 m o d 15 = 1 mod 15=1 (或 i i 2 % 15 = 1 15=1 ),通过手动计算不难发现满足条件的数字是 1 , 4 , 6 , 14 1,4,6,14 ;共计 4 4 个数,因此答案是 4 4
3. 8 8
【解析】这是一道递归的计算题,如果直接这么做显然显得麻烦了。因此我们可以通过画二维表的方式来求解这个答案。
T3
对于第0行,其大小为该纵坐标。
对于第0列,其大小为该横坐标对于3取模的值。
对于任何一个非0坐标,其大小为上面的数值加上左上角的数值减去左边的数值。
我们可以采用递推的方法解决。
4. 6 6
【解析】这道题就是一个模拟链表的过程,查找有多少个联通快。仔细模拟,发现是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分已经是很满意了。
若有疏忽或者意见望大家指正。

猜你喜欢

转载自blog.csdn.net/Ronaldo7_ZYB/article/details/83098444