首页 > 其他分享 >2024年BCSP-X初赛真题解析(小高组)

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

时间:2024-06-20 09:03:50浏览次数:13  
标签:BCSP __ last 真题 int 初赛 答案 ans tmp

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


单选题

第1题

计算机在工作过程中突然停电,( )中的信息不会丢失。

A.显存

B.寄存器

C.RAM

D.ROM

【答案】:D

第2题

中缀表达式a*(b+c)-d的后缀形式是( )。

A.abcd*±

B.abc+*d-

C.abc*+d-

D.-+*abcd

【答案】:B

第3题

设栈S的初始状态为空,元素a,b,c,d,e依次入栈,以下出栈序列不可能出现的有( )。

A.a,b,c,e,d

B.b,c,a,e,d

C.a,e,c,b,d

D.d,c,e,b,a

【答案】:C

第4题

已知7个结点的二叉树的先根遍历是1245637(数字为结点编号),中根遍历是4265173,则该二叉树的后根遍历是( )。

A.4652731

B.4652137

C.4231547

D.4653172

【答案】:A

第5题

在C++中, 若变量x为int类型且已被赋值为40, 则x&(x-1) 的值为( )。

A.79

B.47

C.32

D.0

【答案】:C

第6题

有一个等比数列,共有奇数项,其中第一项和最后一项分别是2和118098,中间一项是486,请问以下那个数是可能的公比( )。

A.2

B.3

C.4

D.5

【答案】:B

第7题

设变量x为float类型且己赋值, 则以下语句能将x中的数值四舍五入到小数点后第2位的是( )。

A.x = (x * 100 + 0.5) / 100.0

B.x = x * 100 + 0.5 / 100.0

C.x = (x / 100 + 0.5) * 100.0

D.x = (int)(x * 100 + 0.5) / 100.0

【答案】:D

第8题

十六进制下,7 * 7的运算结果为( )。

A.31

B.38

C.41

D.48

【答案】:A

第9题

( )是一种选优搜索法,按选优条件向前搜索,以达到目标。当搜索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择。

A.回溯法

B.枚举法

C.动态规划

D.贪心

【答案】:A

第10题

1TB代表的字节数是( )。

A.2的10次方

B.2的20次方

C.2的30次方

D.2的40次方

【答案】:D

第11题

原字符串中任意一段连续的字符所组成的新字符串称为子串。则字符“AAABBBCCC"共有( )个不同的非空子串。

A.3

B.12

C.36

D.45

【答案】:C

第12题

1958年以前的第一代计算机主要用于科学计算、军事研究。这些计算机以( )为主要的逻辑元件。

A.晶体管

B.电子管

C.集成电路

D.大规模集成电路

【答案】:B

第13题

链表不具备的特点是( )。

A.可用O(1)时间随机访问任何一个元素。

B.插入、删除操作不需要移动元素。

C.存储单元在内存中的地址可以不连续。

D.无需事先估计存储空间大小。

【答案】:A

第14题

以下排序算法中,( )属于稳定排序算法。

A.堆排序

B.选择排序

C.冒泡排序

D.快速排序

【答案】:C

第15题

完全二叉树的顺序存储方案,是指将完全二叉树的结点从上到下、从左到右依次存放到一个顺序结构的数组中。假定根结点存放在数组的1号位置上,则第k号结点的父结点如果存在的话,应当在放在数组中的( )号位置。

A.2k

B.2k+1

C. ⌈ k / 2 ⌉ \lceil k/2 \rceil ⌈k/2⌉

D. ⌊ k / 2 ⌋ \lfloor k/2 \rfloor ⌊k/2⌋

【答案】:C

阅读程序

#include <iostream>
using namespace std;
int main() {
    int n, a[105], avg=0, ans=0;
    cin >> n;
    for (int i=1; i<=n; i++) {
        cin >> a[i];
        avg += a[i];
    }
    avg /= n;
    for (int i=1; i<n; i++)
        if (a[i]<avg) {
            a[i+1] -= (avg-a[i]);
            ans += (avg-a[i]);
        }
        else if (a[i]>avg) {
            a[i+1] += (a[i]-avg);
            ans += (a[i]-avg);
        }
    cout << ans << endl;
    return 0;
}

假设输入的所有数是不超过100的正整数,完成下面的判断题和单选题:

第16题

该程序的算法时间复杂度为O(n)。( )

A.正确

B.错误

【答案】:A

第17题

若将第4行的代码改为“int n, a[105], avg, ans;”(声明变量时不赋值), 程序仍可以被正常执行,且对于相同的输入数据,输出结果不变。( )

A.正确

B.错误

【答案】:A

第18题

若将第4行的代码改为“int n, a[100], avg=0, ans=0”(更改数组a的大小),程序仍可以被正常执行,且对于相同的输入数据,输出结果不变。( )

A.正确

B.错误

【答案】:B

第19题

若将第11行的for循环执行条件改为“i<=n”, 程序仍可以被正常执行, 且对于相同的输入数据,输出结果不变。( )

A.正确

B.错误

【答案】:B

第20题

若将第16行的代码改为“else{”(去掉else之后的条件判断) , 程序仍可以被正常执行, 且对于相同的输入数据,输出结果不变。( )

A.正确

B.错误

【答案】:A

第21题

该程序的输出结果不可能为负数。( )

A.正确

B.错误

【答案】:A

第22题

若输入数据第一行为“7”,第二行为“1 9 2 8 12 2 8”,则程序将输出( )。

A.2

B.16

C.21

D.26

【答案】:C

#include <iostream>
using namespace std;
int n, h[1000005], L, R;
long long m;
int main() {
    cin >> n >> m;
    for (int i=1; i<=n; i++) {
        cin >> h[i];
        if (h[i]>R) R = h[i];
    }
    while (L < R) {
        int mid = (L+R+1) / 2;
        long long tmp = 0;
        for (int i=1; i<=n; i++) 
            if (h[i]>mid)
                tmp += h[i]-mid;
            if (tmp<m)
                R = mid - 1;
            else 
                L = mid;
    }
    cout << L << endl;
}

假设输入的所有数是正整数,其中n以及数组元素h[1],h[2],…,h[n]均不超过1000000,m不超过h[1],h[2],…,h[n]之和,完成下面的判断题和单选题:

第23题

若将第011行的while循环执行条件改为“L <= R", 程序仍可以被正常执行, 且对于相同的输入数据,输出结果不变。( )

A.正确

B.错误

【答案】:B

第24题

若将变量m和变量tmp的数据类型都改为int, 程序仍可以被正常执行, 且对于相同的输入数据输出结果不变。( )

A.正确

B.错误

【答案】:B

第25题

程序的输出结果有可能是0。( )

A.正确

B.错误

【答案】:A

第26题

将第12行的代码改为( ),程序执行的效果不变。

A.int mid = (L+R) / 2;

B.int mid = (L+R) * 2;

C.int mid = L + R + 1 << 2;

D.int mid = L + R + 1 >> 2;

【答案】:无

第27题

若输入数据第一行为“5 20”,第二行为“4 42 40 26 46”,则程序将输出( )。

A.35

B.36

C.37

D.38

【答案】:B

第28题

若输入的n为10000,程序输出结果的最大可能值是( )。

A.9999

B.10000

C.999999

D.1000000

【答案】:C

#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 5000 + 5;
int n, a[MAXN], d[MAXN];
int check(int k) {
    memset(d, 0, sizeof(d));
    int res = 0;
    for (int i=1, s=0; i<=n; i++) {
        s += d[i];
        if ((a[i]+s)%2==1)
            continue;
        if (i+k>n+1)
            return 1e9;
        d[i]++, s++, res++;
        d[i+k]--;
    }
    return res;
}
int main() {
    scanf("%d", &n);
    for (int i=1; i<=n; i++)
        scanf("%d", &a[i]);
    int ans = 1e9;
    for (int k=1; k<=n; k++) {
        int tmp = check(k);
        if (tmp < ans) 
            ans = tmp;
    }
    printf("%d\n", ans);
    return 0;
}

假设输入的n是不超过5000的正整数,数组元素a[1],a[2],…,a[n]均是不超过1的非负整数,完成下面的判断题和单选题:

第29题

若将第9行的for循环执行条件改为“i+k-1<=n”, 程序仍可以被正常执行, 且对于相同的输入数据,输出结果不变。( )

A.正确

B.错误

【答案】:B

第30题

若将第15行的代码改为"s++, res++; ”(去掉d[i]++) , 程序仍可以被正常执行, 且对于相同的输入数据,输出结果不变。( )

A.正确

B.错误

【答案】:A

第31题

若将第15行中的“s++”改为“s–”,程序仍可以被正常执行,且对于相同的输入数据,输出结果不变。( )

A.正确

B.错误

【答案】:B

第32题

程序的输出结果有可能为0。( )

A.正确

B.错误

【答案】:A

第33题

程序的输出结果必然小于输入的n。( )

A.正确

B.错误

【答案】:B

第34题

该程序的算法时间复杂度为( )。

A. O ( n ) O(n) O(n)

B. O ( n l o g n ) O(nlogn) O(nlogn)

C. O ( n 2 ) O(n^2) O(n2)

D. O ( n 2 l o g n ) O(n^2logn) O(n2logn)

【答案】:C

第35题

若输入数据第一行为“7”,第二行为“0010100”,则程序将输出( )。

A.3

B.4

C.5

D.6

【答案】:A

完善程序

(一)给定长度n的整数序列a,a,…,a,以及q个询问。每个询问将指定两个整数l,r,请判断下标在l到r之间的序列元素(包括 a l a_l al​与 a r a_r ar​)是否互不相同。输入数据保证 1 ≤ n , q ≤ 100000 , 1 ≤ a i ≤ n , l ≤ 1 ≤ r ≤ n 1\le n,q\le 100000,1\le a_i\le n,l\le 1\le r\le n 1≤n,q≤100000,1≤ai​≤n,l≤1≤r≤n。

试用最优选项补全程序:

#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1e5+5;
int n, q, a[MAXN], last[MAXN], tmp[MAXN], mxlast[MAXN];
int main() {
    cin >> n >> q;
    for (int i=1; i<=n; i++) {
        cin >> a[i];
        __1__;
        __2__;
        __3__;
        if (last[i]>mxlast[i])
            mxlast[i] = last[i];
    }
    while (__4__) {
        int l, r;
        cin >> l >> r;
        if (__5__)
            cout << "No" << endl;  //区间内存在相同元素
        else 
            cout << "YES" << endl;  //互不相同
    }
    return 0;
}

第36题

1处应填( )。

A.last[tmp[i]] = a[i]

B.last[i] = tmp[a[i]]

C.tmp[last[i]] = i

D.tmp[a[i]] = i

【答案】:B

第37题

2处应填( )。

A.last[tmp[i]] = a[i]

B.last[i] = tmp[a[i]]

C.tmp[last[i]] = i

D.tmp[a[i]] = i

【答案】:D

第38题

3处应填( )。

A.mxlast[i] = MAXN

B.mxlast[i] = tmp[i]

C.mxlast[i] = 0

D.mxlast[i] = mxlast[i-1]

【答案】:D

第39题

4处应填( )。

A.q–

B.–0

C.!(q–)

D.!(–q)

【答案】:A

第40题

5处应填( )。

A.mxlast[l] <= r

B.mxlast[r] <= l

C.mxlast[l] >= r

D.mxlast[r] >= l

【答案】:D

(二)给定正整数n,请编写程序计算它的全部正约数之和。输入数据保证 n ≤ 10000000 n\le 10000000 n≤10000000。

试用最优选项补全程序:

#include <iostream>
#include <algorithm>
using namespace std;

const int MAXN = 10000005;
int n, d[MAXN];
bool flag[MAXN];

long long value(int x, int k) {
    long long ans = 1;
    for (int i=1; i<=k+1; i++)
        ans *= x;
    return __1__;
}

int main() {
    for (__2__) {
        if (flag[i]) continue;
        for (int j=i; j<MAXN; j+=i) {
            if (flag[j]) continue;
            flag[j] = true;
            __3__;
        }
    }
  
    cin >> n;
    long long ans = 1;
    int last = -1, t = 0;
    for (; n>1; __4__) {
        if (d[n]==last) t++;
        else {
            ans *= value(last, t);
            __5__;
        }
    }
    ans *= value(last, t);
    cout << ans << endl;
    return 0;
}

第41题

1处应填( )。

A.ans / (x-1)

B.ans * (x-1)

C.(ans-1) * (x-1)

D.(ans-1) / (x-1)

【答案】:D

第42题

2处应填( )

A.int i=1; i<MAXN; i++

B.int i=1; i<=MAXN; i++

C.int i=2; i<MAXN; i++

D.int i=2; i<=MAXN; i++

【答案】:C

第43题

3处应填( )。

A.d[j]=i

B.d[i]=j

C.d[i]=i

D.d[j]=j

【答案】:A

第44题

4处应填( )

A.n -= d[n]

B.n -= last

C.n /= d[n]

D.n–

【答案】:C

第45题

5处应填( )

A.last = d[n], t=0

B.last = d[n], t=1

C.last = d[n], t–

D.last = -1, t = 0

【答案】:B

标签:BCSP,__,last,真题,int,初赛,答案,ans,tmp
From: https://blog.csdn.net/guolianggsta/article/details/139811241

相关文章