2024年BCSP-X初赛真题解析(初中组)

学习C++从娃娃抓起!学习下帝都的对标CSP的BCSP考试,记录下CSP-J备考学习的每一个瞬间。


单选题

第1题

在以下选项中,哪一个是计算机的输入设备?

A.监示器

B.键盘

C.磁盘

D.打印机

【答案】:B

第2题

十进制数12.3125转换成二进制数是什么?

A.1100.1

B.1011.011

C.1100.0101

D.1100.101

【答案】:C

第3题

某台计算机的内存容量为640K,这表示该计算机拥有多少字节的内存空间?

A.640个

B.640 * 1000个

C.640 * 1024个

D.640 * 1024 * 1024个

【答案】:C

第4题

在以下选项中,哪种存储设备在断电后仍然能够保持其存储的数据不变?

A.硬盘

B.寄存器

C.显存

D.内存

【答案】:A

第5题

在下列世界著名的奖项中,哪一个是专门用来表彰在计算机科学和技术领域有重大贡献的科学家的?

A.沃尔夫奖

B.诺贝尔奖

C.菲尔兹奖

D.图灵奖

【答案】:D

第6题

在某段程序中,有3个整型变量a、b、c,执行完以下代码段后,变量c的值是( )。

a = 15;
b = a * 3;
a++;
c = a + b/2;

A.15

B.38

C.38.5

D.16

【答案】:B

第7题

下面循环结构中,循环体执行的次数为( )次。

int n = 315;
while (n>0) n = n/3;

A.无数

B.4次

C.6次

D.5次

【答案】:C

第8题

在Linux操作系统中, 应该使用哪个命令来检查两个文件内容是否完全相同?

A.cmd

B.diff

C.fc

D.cmp

【答案】:B

第9题

对于一个按照’a,b,c,d,e’顺序入栈的序列,哪个出栈序列是不符合栈的后进先出(LIFO)原则的?

A.a,b,c,d,e

B.d,b,c,a,e

C.b,a,d,c,e

D.c,b,a,d,e

【答案】:B

第10题

线性表若采用链表存储结构,要求内存中可用存储单元地址( )。

A.必须连续

B.部分地址必须连续

C.一定不连续

D.连续不连续均可

【答案】:D

第11题

对于一棵二叉树, 它的中序遍历结果为“LKMACBFEHGID", 层次遍历结果为“AKBLMCDEFGHI", 那么这棵二叉树对应的前序遍历结果是下列哪个?

A.AKLMBCDEFGHI

B.ALMKBDECFHIG

C.LABMDCHGIKEF

D.ALKMCBDEFGHI

【答案】:A

第12题

如果一棵完全二叉树总共有72个节点,那么这棵树中有多少个叶子节点?

A.30

B.27

C.36

D.39

【答案】:C

第13题

对于表达式a+b*(c+d)*e的后缀形式是( )。

A.abcd*+*e+

B.a+b*c+d*e

C.abcd+*e*+

D.bcda+e*+*

【答案】:C

第14题

以下排序算法中,不需要进行关键字比较操作的算法是( )

A.快速排序

B.冒泡排序

C.归并排序

D.基数排序

【答案】:D

第15题

5个没有区别的结点构成不同形态的二叉树的种类有( )个

A.30

B.35

C.42

D.40

【答案】:C

第16题

四个人A、B、C、D需要在深夜过桥,他们只有一只手电筒,每个人过桥的时间分别是2分钟、3分钟、5分钟、10分钟,而且每次只能两个人一起过桥,并且必须有人带着手电筒。请问他们最少需要多长时间才能全部安全过桥?答:( )分钟。

A.18

B.22

C.21

D.24

【答案】:C

第17题

田忌和齐王各自有11匹马,他们要进行比赛,每匹马只能参加一次且必须参加一次。比赛规则是速度更快的马获胜,速度相同则为平局。田忌赢一次赏金加50钱,输一次赏金减50钱,平局则不加不减。例如田忌有一匹马速度为3,齐王有一匹马速度为2,则这两匹马比赛,田忌能赚50钱。现在田忌的11匹马速度为(4 7 5 6 10 9 9 1 5 3 6),齐王的11匹马速度为(7 2 9 1 1 3 1 8 1 3 11),问求田忌最多能赚多少赏金钱?答:田忌最多能赚( )钱。

A.450

B.300

C.200

D.500

【答案】:A

阅读程序

第18题

#include <iostream>
using namespace std;
int main() {
    int a, b, c, d;
    b = a/3600;
    c = a % 3600 / 60;
    d = a % 60;
    cout << b << " " << c << " " << d;
    return 0;
}

输入:123456

输出:( )

A.34 18 26

B.36 17 34

C.34 17 36

D.30 18 33

【答案】:C

第19题

#include <bits/stdc++.h>
using namespace std;
int main() {
    int a, i;
    bool f = true;
    cin >> a;
    cout << a << "=";
    for (i=2; i<=a; i++) 
    {
        while (a%i==0)
        {
            if (f==true)
            {
                cout << i;
                f = false;
            }
            else 
                cout << "*" << i;
            a = a / i;
        }
    }
    return 0;
}

输入:300

输出:( )

A.300=2*2*3*5*5

B.2*2*5*5

C.300=2*10*15

D.300=2*2*5*5*3

【答案】:A

第20题

#include <bits/stdc++.h>
using namespace std;
int a[105];
int b[105];
int n, k, t, i, j, num;
int main() 
{
    cin >> n;
    for (i=0; i<n; i++)
        cin >> b[i];
    for (num=0; num<n; num++)
    {
        for (i=n-1; b[i]!=0; i--);
        a[i] = num;
        b[i] = -1;
        for (j=i+1; j<n; j++) b[j]--;
    }
    for (i=0; i<n; i++)
        cout << a[i] << " ";
    return 0;
}

输入:

8

0 1 1 1 2 3 5 7

输出:( )

A.1 4 7 2 3 5 0

B.0 6 4 1 2 3 5 7

C.0 6 3 0 6 4

D.0 0 5 1 2 3 9 2

【答案】:B

第21题

#include <bits/stdc++.h>
using namespace std;

int a[6][6], s[6];
bool v[6], f;
void dfs(int x)
{
    if (x==6)
    {
        f = 1;
        for (int i=1; i<=5; i++)
            cout << char(s[i]+'A'-1) << ' ';
        cout << endl;
    }
    else 
    {
        for (int i=1; i<=5; i++)
        {
            if (a[x][i]==1 && v[i]==0)
            {
                s[x] = i;
                v[i] = 1;
                dfs(x+1);
                v[i] = 0;
            }
        }
    }
    return ;
}

int main()
{
    for (int i=1; i<=5; i++)
    {
        for (int j=1; j<=5; j++)
        {
            cin >> a[i][j];
        }
    }
    dfs(1);
    if (f==0) cout << "no";
    return 0;
}

输入:

1 0 1 1 0

0 0 0 0 1

0 0 1 0 1

1 1 0 1 1

0 0 0 1 0

输出:( )

A.C B E A D

B.A E C D B

C.C A E D Q

D.A E C B D

【答案】:D

完善程序

(一)(输出排列)给定一个长为n的数组a(不保证元素互不相同),找出它的全排列里字典序不小于它的所有不同排列,并把它们按照字典序从小到大输出。下面的程序会对于每个排列先输出它是这些排列中字典序第几大的,然后再输出它的每个元素。

#include <bits/stdc++.h>
using namespace std;

int a[105];

int main()
{
    int n, i, j, c=1;
    scanf("%d", &n);
    for (i=1; i<=n; i++)
        scanf("%d", a+i);
    while (true)
    {
        printf("%d: ", __1__);
        for (i=1; i<=n; i++)
            printf("%d ", a[i]);
        printf("\n");
        for (__2__)
        {
            if (a[i]<a[i+1]) break;
        }
        if (i== __3__) break;
        for (j=n; j>i; j--)
        {
            if (__4__) swap(a[j], a[n+i+1-j]);
        }
        for (j=i+1; j<=n; j++)
        {
            if (a[j]>a[i])
            {
                __5__;
                break;
            }
        }
    }
    return 0;
}

第22题

1处应填( )。

A.c

B.c+1

C.++c

D.c++

【答案】:D

第23题

2处应填( )

A.i=1; i<n; i++

B.i=n-1; i>=1; i–

C.i=1; a[i]!=a[n]; i++

D.a[i] = a[n-1]; i>=1; i–

【答案】:B

第24题

3处应填( )

A.0

B.1

C.n

D.n-1

【答案】:A

第25题

4处应填( )

A.j!=n+i+1-j

B.j==n+i+1-j

C.j>n+i+1-j

D.a[j]>a[n+i+1-j]

【答案】:C

第26题

5处应填( )

A.a[j]=a[i]

B.swap(a[i],a[j])

C.swap(i,j)

D.a[i]=a[j]

【答案】:B

(二)(二进制位加权和)给定一一个64位二进制数x,假设x的二进制表示 a 64 a 63 … a 1 a_{64}a_{63}\dots a_1 a64a63a1,即 x = 2 64 × a 64 + a 63 × a 63 + ⋯ + 2 0 × a 1 x = 2^{64}\times a_{64} + a^{63}\times a_{63}+\dots + 2^0\times a_1 x=264×a64+a63×a63++20×a1,求 i a i ia_i iai加起来的结果。下面程序将使用倍增法解决该问题,我们以“求x二进制表示下1的个数”这一问题为例介绍倍增法的思想。

在一开始,我们把给定的x看作是分成了64块,每块长度为1,每个块内的二进制数表示原数这个块内的1的个数。我们将进行若干轮操作,每轮合并两个相邻的块,让块长翻倍,合并成的新块上存的二进制数就是两个原块上存的二进制数加起来。

这个示例代码可以对0~65535的x求出1的个数:

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long u64;

int main()
{
    u64 x;
    scanf("%llu", &x);
    x -= (x & 0xaaaaaaaaaaaaaaaaull) >> 1;
    x = (x & 0x3333333333333333ull) + ((x & 0xccccccccccccccccull) >> 2);
    x = (x & 0x0f0f0f0f0f0f0f0full) + ((x & 0xf0f0f0f0f0f0f0f0ull) >> 4);
    x = (x & 0x00ff00ff00ff00ffull) + ((x & 0xff00ff00ff00ff00ull) >> 8);
    printf("%llu\n", x);
    return 0;
}

请补全程序:

#include <iostream>
using namespace std;
typedef unsigned long long u64;

int main()
{
    u64 i, x, y, P, Q ,K, R;
    scanf("%llu", &x);
    y = __1__;
    P = __2__;
    Q = 1;
    for (i=0; i<6; i++)
    {
        K = __3__;
        P /= K;
        R = P * Q;
        y = (y & R) + __4__;
        y += __5__;
        x = (x & R) + ((x >> (1 << i)) & R);
        Q *= K;
    }
    printf("%llu\n", y);
    return 0;
}

第27题

1处应填( )

A.0

B.x

C.1

D.-1

【答案】:B

第28题

2处应填( )

A.0

B.y

C.-1

D.1

第29题

3处应填( )

A.(1<<(1<<i))

B.(1<<i)+1

C.i

D.(1ull<<(1<<i))+1

【答案】:D

第30题

4处应填( )

A.((y>>(1<<i))&R)

B.((y>>i)&Q)

C.(y&R)

D.((y^Q)&R)

【答案】:A

第31题

5处应填( )

A.(((x>>(1<<i))&R)<<(1<<i))

B.(((x>>(1<<i))&R)<<i)

C.((((x>>i)&R)<<i)

D.x

【答案】:B

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值