Dotcpp  >  试卷列表  >  NOIP第十九届全国青少年信息学奥林匹克联赛初赛试题[2013普及组]

NOIP第十九届全国青少年信息学奥林匹克联赛初赛试题[2013普及组]


第1题

一个 32 位整型变量占用( )个字节。

共 1.5 分 

第2题

二进制数 11.01 在十进制下是( )。

共 1.5 分 

第3题

下面的故事与( )算法有着异曲同工之妙。 

从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:“从前有座山,山 里有座庙,庙里有个老和尚在给小和尚讲故事:‘从前有座山,山里有座庙,庙里有个 老和尚给小和尚讲故事 .... ’

共 1.5 分 

第4题

逻辑表达式( )的值与变量 A 的真假无关。

共 1.5 分 

第5题

将( 2, 6, 10, 17 )分别存储到某个地址区间为 0~10 的哈希表中,如果哈希函数 h(x) = ( ),将不会产生冲突,其中 a mod b 表示 a 除以 b 的余数。

共 1.5 分 

第6题

在十六进制表示法中,字母 A 相当于十进制中的( )。

共 1.5 分 

第7题

下图中所使用的数据结构是( )。

QQ截图20210122231716.png

共 1.5 分 

第8题

在 Windows 资源管理器中,用鼠标右键单击一个文件时,会出现一个名为 “复制 ”的操作选 项,它的意思是( ) 。

共 1.5 分 

第9题

已知一棵二叉树有 10 个节点,则其中至多有( )个节点有 2 个子节点。

共 1.5 分 

第10题

在一个无向图中,如果任意两点之间都存在路径相连,则称其为连通图。下图是一个有 4 个 顶点、 6 条边的连通图。若要使它不再是连通图,至少要删去其中的( )条边。

QQ截图20210122231923.png

共 1.5 分 

第11题

二叉树的( )第一个访问的节点是根节点。

共 1.5 分 

第12题

以 A 0 作为起点,对下面的无向图进行 深度 优先遍历时,遍历顺序 不可能 是( )。

QQ截图20210122232035.png

共 1.5 分 

第13题

IPv4 协议使用 32 位地址,随着其不断被分配,地址资源日趋枯竭。因此,它正逐渐被使 用( )位地址的 IPv6 协议所取代。

共 1.5 分 

第14题

( )的 平均 时间复杂度为 O(n log n) ,其中 n 是待排序的元素个数。

共 1.5 分 

第15题

下面是根据欧几里得算法编写的函数,它所计算的是 a 和 b 的( )。

1
2
3
4
5
6
7
int euclid(int a, int b)
{
 if (b == 0)
 return a;
 else
 return euclid(b, a % b);
}


共 1.5 分 

第16题

通常在搜索引擎中,对某个关键词加上双引号表示( )。

共 1.5 分 

第17题

中国的国家顶级域名是( )。

共 1.5 分 

第18题

把 64 位非零浮点数强制转换成 32 位浮点数后,不可能( )。

共 1.5 分 

第19题

下列程序中,正确计算 1, 2, …, 100 这 100 个自然数之和 sum (初始值为 0 ) 的是 ( )。

程序段 1

1
2
3
4
5
i = 1;
do {
    sum += i;
    i++;
while (i <= 100);

程序段 2

1
2
3
4
5
i = 1;
do {
    sum += i;
    i++;
while (i > 100);

程序段 3

1
2
3
4
5
i = 1;
while (i < 100) {
    sum += i;
    i++;
}

程序段 4

1
2
3
4
5
i = 1;
while (i >= 100) {
    sum += i;
    i++;
}


共 1.5 分 

第20题

CCF NOIP 复赛全国统一评测时使用的系统软件是( )。

共 1.5 分 

第21题

7 个同学围坐一圈,要选 2 个不相邻的作为代表,有____种不同的选法。

共 5 分 

第22题

某系统自称使用了一种防窃听的方式验证用户密码。密码是 n 个数 s1, s2, , , sn ,均为 0 或 1 。 该系统每次随机生成 n 个数 a1, a2, …… , an , 均为 0 或 1 , 请用户回答 (s1a1+ s2a2+ …… + snan) 除以 2 的余数。如果多次的回答总是正确,即认为掌握密码。该系 统认为,即使问答的过程被泄露,也无助于破解密码——因为用户并没有直接发送密码。 然而,事与愿违。例如,当 n = 4 时,有人窃听了以下 5 次问答:就破解出了密码 s1 = _________ , s2 = _________ ,s3 = _________ , s4 = _________ 。(答案用逗号隔开)

QQ截图20210122232743.png

共 5 分 

第23题

1
2
3
4
5
6
7
#include <iostream>
using namespace std;
int main(){
    int a, b;
    cin>>a>>b;
    cout<<a<<"+"<<b<<"="<<a+b<<endl;
}

输入: 3 5 

输出:

共 8 分 

第24题

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
int main(){
    int a, b, u, i, num;
    cin>>a>>b>>u;
    num = 0;
    for (i = a; i <= b; i++)
        if ((i % u) == 0) num++;
    cout<<num<<endl;
    return 0;
}

输入: 1 100 15 

输出:

共 8 分 

第25题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
int main(){
    const int SIZE = 100;
    int n, f, i, left, right, middle, a[SIZE];
    cin>>n>>f;
    for (i = 1; i <= n; i++)
        cin>>a[i];
    left = 1;
    right = n;
    do {
        middle = (left + right) / 2;
        if (f <= a[middle])
            right = middle;
        else
            left = middle + 1;
    while (left < right);
    cout<<left<<endl;
    return 0;
}

输入: 

12 17 

2 4 6 9 11 15 17 18 19 20 21 25 

输出:

共 8 分 

第26题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
int main(){
    const int SIZE = 100;
    int height[SIZE], num[SIZE], n, ans;
    cin>>n;
    for (int i = 0; i < n; i++) {
        cin>>height[i];
        num[i] = 1;
        for (int j = 0; j < i; j++) {
            if ((height[j] < height[i]) && (num[j] >= num[i]))
                num[i] = num[j]+1;
        }
    }
    ans = 0;
    for (int i = 0; i < n; i++) {
        if (num[i] > ans) ans = num[i];
    }
    cout<<ans<<endl;
}

输入: 

2 5 3 11 12 4 

输出:

共 8 分 

第27题

(序列重排)全局数组变量 a 定义如下: 

const int SIZE = 100; 

int a[SIZE], n; 

它记录着一个长度为 n 的序列 a [1], a[2], …,a[ n ] 。 

现在需要一个函数,以整数 p (1 ≤ p ≤ n ) 为参数,实现如下功能:将序列 a 的前 p 个数与后 n–p 个数对调,且不改变这 p 个数(或 n – p 个数)之间的相对位置。例如,长度为 5 的序列 1, 2, 3, 4, 5 ,当 p = 2 时重排结果为 3, 4, 5, 1, 2 。 

有一种朴素的算法可以实现这一需求,其时间复杂度为 O( n ) 、空间复杂度为 O( n) :

1
2
3
4
5
6
7
8
9
void swap1(int p){
    int i, j, b[SIZE];
    for (i = 1; i <= p; i++)
        b[ ① ] = a[i];  
    for (i = p + 1; i <= n; i++)
        b[i - p] = ② ;  
    for (i = 1; i <= ③ ; i++)  
        a[i] = b[i];
}

我们也可以用时间换空间,使用时间复杂度为 O(n2) 、空间复杂度为 O(1) 的算法:

1
2
3
4
5
6
7
8
9
void swap2(int p){
    int i, j, temp;
    for (i = p + 1; i <= n; i++) {
        temp = a[i];
    for (j = i; j >= ④ ; j--)
        a[j] = a[j - 1];
        ⑤ = temp;  
    }
}


共 14 分 

第28题

(二叉查找树)二叉查找树具有如下性质:每个节点的值都大于其左子树上所有节点的值、小于 其右子树上所有节点的值。试判断一棵树是否为二叉查找树。 

输入的第一行包含一个整数 n,表示这棵树有 n 个顶点,编号分别为 1, 2, …, n ,其中编号为 1 的为根结点。之后的第 i 行有三个数 value, left_child, right_child ,分别表示该节点关 键字的值、左子节点的编号、右子节点的编号;如果不存在左子节点或右子节点,则用 0 代替。输 出 1 表示这棵树是二叉查找树,输出 0 则表示不是。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
const int SIZE = 100;
const int INFINITE = 1000000;
struct node {
    int left_child, right_child, value;
};
node a[SIZE];
int is_bst(int root, int lower_bound, int upper_bound){
    int cur;
    if (root == 0)return 1;
    cur = a[root].value;
    if ((cur > lower_bound) && ( ① ) &&
    (is_bst(a[root].left_child, lower_bound, cur) == 1) && (is_bst(②,③,④) == 1))
        return 1;
    return 0;
}
int main(){
    int i, n;
    cin>>n;
    for (i = 1; i <= n; i++)
        cin>>a[i].value>>a[i].left_child>>a[i].right_child;
    cout<<is_bst( ⑤ , -INFINITE, INFINITE)<<endl;
    return 0;
}


共 14 分 

试卷信息

题量: 28 道
总分: 100 分
一、单项选择题(1-20 共 20 题);
二、问题求解(21-22 共 2 题);
三、阅读程序写结果。(23-26 共 4 题);
四、完善程序(27-28 共 2 题)。