目录
点击蓝色字体可以快速切换到想看的内容,写了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 )是计算机存储信息的基本单位。
下列协议中与电子邮件无关的是( ).
计算机基础与编程环境,计算机网络与Internet的基本概念
解析:
选C,常用的电子邮件协议有SMTP、POP3、IMAP4
分辨率为 800x600、16 位色的位图,存储图像信息所需的空间为( )。
A.937.5KB
B.4218.75KB
C.4320KB
D.2880KB
计算机基础与编程环境字节与字
解析:
选A,800×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) 称为逆序对当且仅当i
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 轮后,他的坐标是:( _________ , _________ )。(请在答题纸上用逗号隔开两空答案)
知识点:数学,初中数学
解析:
答案: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,至少需要_________次操作。
知识点:数学,逻辑推理
解析:
答案: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++程序设计函数与递归基础算法
解析:
阅读程序写结果:
#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分建议结合题目参考解析对弱项进行复习,最后祝大家在考试中取得好成绩!考的全会,蒙的全对!!!