2017NOIP普及组初赛真题解析

目录

 点击蓝色字体可以快速切换到想看的内容,写了2天,点个赞吧!!球球了!!!

这个链接可以刷题有助于复习:信息学奥赛-NOIP-少儿编程培训-有道小图灵

第一题

第二题

第三题

第四题

第五题

第六题

第七题

第八题

第九题

第十题

第十一题

第十二题

第十三题

第十四题

第十五题

第十六题

第十七题

第十八题

第十九题

第二十题

填空&阅读程序写结果

第二十一题

第二十二题

第二十三题

第二十四题

第二十五题

第二十六题

完善程序

第二十七题

第二十八题

答案汇总

选择题

填空&阅读程序写结果

完善程序

所占分值

总结


第一题

在 8 位二进制补码中,10101011 表示的数是十进制下的( ).

  • A.43

  • B.-85

  • C.-43

  • D.-84                  

数学,数及其运算

解析:

选B,因为10101011符号位为1,所以是负数,负数的补码等于逐位取反后+1。还原过程:首先10101011–1=1010101010101011–1=10101010,再逐位取反得11010101,二进制转十进制−(1×26+1×24+1×22+1×20)=−85−(1×26+1×24+1×22+1×20)=−85。

第二题

计算机存储数据的基本单位是( )。

  • A.bit

  • B.Byte

  • C.GB

  • D.KB

计算机基础与编程环境,字节与字

解析:

选B,字节( Byte )是计算机存储信息的基本单位。

第三题

下列协议中与电子邮件无关的是( ).

  • A. POP3
  • B. SMTP
  • C. WTO
  • D. IMAP

计算机基础与编程环境,计算机网络与Internet的基本概念

解析:

选C,常用的电子邮件协议有SMTP、POP3、IMAP4

第四题

分辨率为 800x600、16 位色的位图,存储图像信息所需的空间为( )。

  • A.937.5KB

  • B.4218.75KB

  • C.4320KB

  • D.2880KB

计算机基础与编程环境字节与字

解析:

选A800×600×16bit=800×600×2(16/8)B=960×1000B=937.5(960×1000/1024)KB。

第五题

计算机应用的最早领域( )

  • A.数值计算

  • B.人工智能

  • C.机器人

  • D.过程控制

计算机基础与编程环境,计算机的历史及其在现代社会中的常见应用

解析:

选A,ENIAC(中文名:埃尼阿克)是美国奥伯丁武器试验场为了满足计算弹道需要而研制成的。

第六题

下列不属于面向对象程序设计语言的是( ).

  • A.C

  • B.C++

  • C.Java

  • D.C#

计算机基础与编程环境,程序设计语言以及程序编译与运行的基本概念

解析:

选A,C语言不是面向对象的编程语言,剩余的都是。

第七题

NOI 的中文意思是( ).

  • A.中国信息学联赛

  • B.全国青少年信息学奥林匹克竞赛

  • C.中国青少年信息学奥林匹克竞赛

  • D.中国计算机协会

计算机基础与编程环境,NOI以及相关活动的历史

解析:

选B,中国计算机学会于1984年创办全国青少年计算机程序设计竞赛(简称:NOI).

第八题

2017 年 10 月 1 日是星期日,1999 年 10 月 1 日是( )。

  • A.星期三

  • B.星期日

  • C.星期五

  • D.星期二

数学,初中数学

解析:

选C,365%7=1365%7=1,非闰年会多出来1天,366%7=2366%7=2,闰年会多出来2天。1999-2017存在5个闰年和13个非闰年,一共多出来5×2+13×1=235×2+13×1=23天,23%7=223%7=2天,因为2017年时星期日,往前倒数2天则是星期五。

第九题

甲、乙、丙三位同学选修课程,从 4 门课程中,甲选修 2 门,乙、丙各选修3门,则不同的选修方案共有( )种。

  • A.36

  • B.48

  • C.96

  • D.192

数学,组合数学

解析:

选C,甲选修两门C(4,2)C(4,2),乙丙选修3门都是C(4,3)C(4,3),一共有 6×4×4=966×4×4=96种可能

第十题

设 G 是有n 个结点、m 条边(n≤m)的连通图,必须删去 G 的( )条边,才能使得 G 变成一棵树。

  • A.m - n + 1

  • B.m - n

  • C.m + n + 1

  • D.n - m + 1

数据结构,常见图,简单树

解析:

选A,一棵n个节点的树有n−1条边,故减少m−n+1条边即可。

第十一题

对于给定的序列{ak​},我们把(i,j) 称为逆序对当且仅当iaj​。那么 序列 {1, 7, 2, 3, 5, 4 } 的逆序对数为( )个。

  • A.4

  • B.5

  • C.6

  • D.7

算法,排序算法

解析:

选B学过冒泡排序的同学可以理解为从左到右,从小到大冒泡排序中发生交换的次数。没有学过的同学也可以通过观察得出,(7,2)(7,3)(7,5)(7,4)(5,4),一共5个。

第十二题

表达式a∗(b+c)∗d 的后缀形式是( ).

  • A.a b c d * + *

  • B.a b c + * d *

  • C.a * b c + * d

  • D.b + c * a * d

数学,数及其运算

解析:

选B中缀转后缀表达式。需要建立一个符号栈。
从左到右扫描中缀表达式:
1.遇到操作数直接输出
2.遇到运算符:
a.( 直接入栈
b. )将栈内( 依次出栈输出,( 只出栈
c.其他运算符入栈,若栈顶高于或等于自己优先级则不断出栈,直到低于自己或遇到( 再入栈

第十三题

向一个栈顶指针为 hs 的链式栈中插入一个指针 s 指向的结点时,应执行( )。

  • A.hs->next = s;

  • B.s->next = hs; hs = s;

  • C.s->next = hs->next; hs->next = s;

  • D.s->next = hs; hs = hs->next;

数据结构,指针类型

解析:

选B,本来是ℎs直接指向下一个结点的,如果想在当前节点和下一节点间插入s指向的结点,需要先把下一结点的地址存储到s指向的结点(s->next=hs),再让当前结点指向s指向的结点(hs=s)。

第十四题

若串 ”S=“copyright”,其子串的个数是( )。

  • A.78

  • B.45

  • C.46

  • D.36

C++程序设计,字符串的处理

解析:

选C子串(字符串) 9+8+7+6+5+4+3+2+1+19+8+7+6+5+4+3+2+1+1(空串)=46=46

第十五题

十进制小数 13.375 对应的二进制数是( )。

  • A.1101.011

  • B.1011.011

  • C.1101.101

  • D.1010.01

计算机基础与编程环境,进制的基本概念与进制转换

解析:

选A整数部分,1101=23+22+20=131101=23+22+20=13,排除BD,也可使用短除法
小数部分,小数十进制转二进制,就是小数部分不断乘以2直到小数完全消失,计算过程中每次取整数部分作为二进制值。
0.375∗2=0.750.375∗2=0.75 ,取整数部分0
0.75∗2=1.50.75∗2=1.5,取整数部分1,其小数部分0.5参与下次计算
0.5∗2=10.5∗2=1,取整数部分1
所以小数部分为011

第十六题

对于入栈顺序为 a,b,c,d,e,f,g 的序列,下列( )不可能是合法的出栈序列。

  • A.a, b, c, d, e, f, g

  • B.a, d, c, b, e, g, f

  • C.a, d, b, c, g, f, e

  • D.g, f, e, d, c, b, a

数据结构,线性表

解析:

选C

第十七题

设 A 和 B 是两个长为 n 的有序数组,现在需要将 A 和 B 合并成一个排好序的数组,任何以元素比较作为基本运算的归并算法在最坏情况下至少要做( )次比较。

  • A.n^2

  • B.nlogn

  • C.2n

  • D.2n-1

算法,排序算法

解析:

选D,A和B中的每一项都需要逐项比较,2n个元素需要比较2n−1次。

第十八题

从( )年开始,NOIP 竞赛将不再支持 Pascal 语言。

  • A.2020

  • B.2021

  • C.2022

  • D.2023

计算机基础与编程环境,NOI以及相关活动的历史

解析:

选C,CCF于2016年11月1日发布《CCF关于NOI系列赛事程序设计语言变更的公告》从2022年开始,NOIP竞赛也将不再支持Pascal语言。

第十九题

一家四口人,至少两个人生日属于同一月份的概率是( )(假定每个人生日属于每个月份的概率相同且不同人之间相互独立)。

  • A.1/12

  • B.1/144

  • C.41/96

  • D.3/4

数学,组合数学,概率

解析:

选C,本题可以反向思考,题目中问至少两个人生日属于同一月份,与之相对的情况就是四个人都不属于同一月份,四个人都不属于同一月份的情况一共有12×11×10×912×11×10×9种情况,四个人生日月份的所有可能共有12×12×12×1212×12×12×12种,四个不属于同一月份的比例是55/9655/96,那么至少两个人属于同一月份就是1−55/96=41/961−55/96=41/96

第二十题

以下和计算机领域密切相关的奖项是( )。

  • A.奥斯卡奖

  • B.图灵奖

  • C.诺贝尔奖

  • D.普利策奖

计算机基础与编程环境,计算机的历史及其在现代社会中的常见应用

解析:

选B,奥斯卡奖是电影类奖项。
诺贝尔有六种奖项:物理、化学、生物和医疗、文学、经济、和平
普利策奖是新闻类奖项

填空&阅读程序写结果

第二十一题

一个人站在坐标(0,0)(0,0)处,面朝 x 轴正方向。第一轮,他向前走 1 单位距离,然后右转;第二轮,他向前走 2 单位距离,然后右转;第三轮,他向前走 3 单位距离,然后右转……他一直这么走下去。请问第 2017 轮后,他的坐标是:( _________ , _________ )。(请在答题纸上用逗号隔开两空答案)

                                     2017NOIP普及组初赛真题解析_第1张图片

知识点:数学,初中数学

解析:

答案:1009,1008每走一步向右转一次,四次转向看作一个循环。2017%4=12017%4=1,左边应该在第一象限,仅观察第一象限的落点,第1轮坐标(1,0)(1,0),第5轮坐标(3,2)(3,2),第9轮(5,4)(5,4)……第n轮((n+1)/2,(n+1)/2−1),结果为((2017+1)/2=1009,1009−1=1008)((2017+1)/2=1009,1009−1=1008)

第二十二题

如下图所示,共有 13 个格子。对任何一个格子进行一次操作,会使得它自己以及与它上下左右相邻的格子中的数字改变(由 1 变 0,或由 0 变 1)。现在要使得所有的格子中的数字都变为 0,至少需要_________次操作。

2017NOIP普及组初赛真题解析_第2张图片

知识点:数学,逻辑推理

解析:

答案:3
要想最少步地把所有归0,那么就要把尽多的1改变。
1.观察可得:操作第三行的第四个数,可以改变更多的1;
2.把操作之后的图画出,继续观察,可得:操作第三行的第三个数,可以改变更多的1;
3.把操作之后的图画出,继续观察,可得:操作第一行的第一个数,可以改变更多的1。

第二十三题

阅读程序写结果:

#include
using namespace std;
int main()
{
    int t[256];
    string s;
    int i;
    cin >> s;
    for (i = 0; i < 256; i++)
        t[i] = 0;
    for (i = 0; i < s.length(); i++)
        t[s[i]]++;
    for (i = 0; i < s.length(); i++)
        if (t[s[i]] == 1)
        {
            cout << s[i] << endl;
            return 0;
        }
    cout << "no" << endl;
    return 0;
}

输入:xyzxyw
输出:_________

知识点:C++程序设计,字符串的处理

解析:

答案:z,程序通过对字符进行计数排序,然后按照从前往后的顺序查找字符串中第一个仅出现一次的字符

第二十四题

阅读程序写结果:

#include
using namespace std;
int g(int m, int n, int x)
{
    int ans = 0;
    int i;
    if (n == 1)
        return 1;
    for (i = x; i <= m / n; i++)
        ans += g(m - i, n - 1, i);
    return ans;
}
int main()
{
    int t, m, n;
    cin >> m >> n;
    cout << g(m, n, 0) << endl;
    return 0;
}

输入:7 3
输出:_________

知识点:C++程序设计函数与递归基础算法

解析:

答案:82017NOIP普及组初赛真题解析_第3张图片 

第二十五题

阅读程序写结果:

#include
using namespace std;
int main()
{
    string ch;
    int a[200];
    int b[200];
    int n, i, t, res;
    cin >> ch;
    n = ch.length();
    for (i = 0; i < 200; i++)
        b[i] = 0;
    for (i = 1; i <= n; i++)
    {
        a[i] = ch[i - 1] - '0';
        b[i] = b[i - 1] + a[i];
    }
    res = b[n];
    t = 0;
    for (i = n; i > 0; i--)
    {
        if (a[i] == 0)
            t++;
        if (b[i - 1] + t < res)
            res = b[i - 1] + t;
    }
    cout << res << endl;
    return 0;
}

输入:1001101011001101101011110001
输出:_________

知识点:C++程序设计字符串的处理

解析:

先看前半部分:
读入字符串ch,用n存它的长度,即28。
b数组初始化,然后从第1格开始遍历数组。
a数组相当于将字符串的每一位转存成数字;
b数组是对a数组求前缀和,
即从开头到这一位的总和,
也就是求到目前出现过多少个1。
如下图,得出a和b两个数组。

再看后半部分:
t是从后往前数,截至目前出现了多少个0。
每次用t的值加上b[i−1],即左上方的格子,
看看是否比当前的res小,小则更新。
注意:t和res这两行是从右往左填的,别看串。
最终答案在左下角,即全部打过擂台后的res。
答案:11

第二十六题

阅读程序写结果:

#include
using namespace std;
int main()
{
    int n, m;
    cin >> n >> m;
    int x = 1;
    int y = 1;
    int dx = 1;
    int dy = 1;
    int cnt = 0;
    while (cnt != 2)
    {
        cnt = 0;
        x = x + dx;
        y = y + dy;
        if (x == 1 || x == n)
        {
            ++cnt;
            dx = -dx;
        }
        if (y == 1 || y == m)
        {
            ++cnt;
            dy = -dy;
        }
    }
    cout << x << " " << y << endl;
    return 0;
}

输入 1:4 3
输出 1:_________

输入 2:2017 1014
输出 2:_________

知识点:C++程序设计基本运算

解析:

核心是后半部分代码,结合输入数据来看。
输入 1:4 3
输出 1:_________
第一组输入数据比较小,适合直接模拟。
x=1,2,3,4,3,2,1
y=1,2,3,2,1,2,3
当x=1,y=3时,满足cnt=2,出循环。
最终会输出1 3
观察x和y的变化规律,会发现其中的周期性。
x和y的值都呈周期性变化,
x会从1递增到n,再递减回1,循环往复;
y则从1递增到m,再递减回1,循环往复。
可以理解为:x做以1和n为顶点的往复运动,
y做以1和m为顶点的往复运动,速度都为1。
出while循环的条件是cnt==2,
说明x和y都正好位于某一侧顶点。
x每n−1次会到达一次顶点,
y每m−1次会到达一次顶点,
所以当两个第一次都到达顶点时,
次数应为n−1和m−1的最小公倍数。

输入 2:2017 1014
输出 2:_________
想知道经过多少轮都达到顶点,
就要求出2016和1013的最小公倍数。
然而2016和1013互质(可用辗转相除验证),
所以就要经过2016∗10132016∗1013轮。
x经过1013轮,y经过2016轮,
因为1013是奇数, 2016是偶数,
所以x会停在右侧顶点,y会回到左侧顶点。
最终输出的就是2017 1

完善程序

第二十七题

完善程序:
(快速幂)请完善下面的程序,该程序使用分治法求xp mod m的值。
输入:三个不超过 10000 的正整数 x,p,m。
输出:xp mod m 的值。
提示:若 p 为偶数,xp=(x2)p/2;若 p 为奇数,xp=x∗(x2)(p−1)/2。

#include
using namespace std;
int x, p, m, i, result;
int main(){
	cin >> x >> p >> m;
	result = ①;
	while (②){
		if (p % 2 == 1)
			result = ③;
		p /= 2;
		x = ④;
	}
	cout << ⑤ << endl;
	return 0;
}

知识点:算法基础算法

解析:

#include 
using namespace std;
int x, p, m, i, result;
int main() {
	cin >> x >> p >> m; 
	result = 1; 
	while (	p>0 或 p!=0 或 p) { //p为指数,当指数不为0时,需要继续运算
		if (p % 2 == 1) //指数p的运算分奇偶:当p为奇数,需要单独拎出一个x做乘法,这样就有偶数的p个x相乘
			result = result * x % m ;
		//偶数的p个x相乘,相当于p/2个x^2。因此x与x相乘一次,p缩小2倍
		p /= 2;
		x = x * x % m;
	}
	cout <<	result << endl;
	return 0;
}

第二十八题

完善程序:
(切割绳子)有 n 条绳子,每条绳子的长度已知且均为正整数。绳子可以以任意正整数长度切割,但不可以连接。现在要从这些绳子中切割出 m 条长度相同的绳段,求绳段的最大长度是多少。
输入:第一行是一个不超过 100 的正整数 n,第二行是 n 个不超过106106的正整数,表示每条绳子的长度,第三行是一个不超过108108的正整数 m。 输出:绳段的最大长度,若无法切割,输出Failed。

#include
using namespace std;
int n, m, i, lbound, ubound, mid, count;
int len[100]; // 绳子长度
int main()
{
    cin >> n;
    count = 0;
    for (i = 0; i < n; i++)
    {
        cin >> len[i];
        ①;
    }
    cin >> m;
    if (②)
    {
        cout << "Failed" << endl;
        return 0;
    }
    lbound = 1;
    ubound = 1000000;
    while (③)
    {
        mid = ④;
        count = 0;
        for (i = 0; i < n; i++)
            ⑤;
        if (count < m)
            ubound = mid - 1;
        else
            lbound = mid;
    }
    cout << lbound << endl;
    return 0;
}

知识点:算法基础算法

解析:
本题是使用二分答案算法计算能切割出m段绳子的最大长度
第一空与第二空相关,计算n根绳子总长,即每1cm切割一段可切成的段数,若仍不满足要求failed
第三~四空为二分算法部分,循环条件和计算二分点,注意避免无限循环,并且注意与边界移动匹配
第五空,遍历n根绳子,计算以mid作为每段长度能切割出多少段,再次根据段数与题目要求之间的关系,移动左右端点,确定下一次二分的区间

答案汇总

选择题

第一题 第二题 第三题 第四题 第五题 第六题 第七题 第八题 第九题 第十题
B B C A A A B C C A
十一题 十二题 十三题 十四题 十五题 十六题 十七题 十八题 十九题 二十题
B B B C A C D C C B

填空&阅读程序写结果

第二十一题 第二十二题 第二十三题
1009,1008 3 z
第二十四题 第二十五题 第二十六题
8 11 一,1 3 二,2017 1

完善程序

二十七题 二十八题
1 count+=len[i]
p count
result*x%m ubound>lbound
x*x%m (lbound+ubound+1)/2
result count+=len[i]/mid

所占分值

第一部分选择题每题占1.5分,总共30分。

第二部分阅读程序写结果第二十一,二十二题一题占5分,二十三~二十六题一题占8分,总共42分。

第三部分完善程序每大题占14分,第二十七题第一空2分剩下三空每空3分,第二十八题前两空每空2.5分剩下三空每空3分,总共28分。

总结

整套真题满分100.0分,分为三部分:选择题,阅读程序写结果和完善程序。其中完善程序单题分值最高一题占14分建议结合题目参考解析对弱项进行复习,最后祝大家在考试中取得好成绩!考的全会,蒙的全对!!!

你可能感兴趣的:(算法,csp,算法,c++,开发语言,网络)