#360. CSP 2025 入门级第一轮

CSP 2025 入门级第一轮

  1. 一个32位无符号整数可以表示的最大值,最接近下列哪个选项?( ) {{ select(1) }}
  • 4×10^9
  • 3×10^10
  • 2×10^9
  • 2×10^10

2.在C++中,执行int x=255;cout<(×&(x-1));后,输出的结果是?( ) {{ select(2) }}

  • 255
  • 254
  • 128
  • 0

3.函数calc(n)的定义如下,则calc(5)的返回值是多少?( )

int calc(int n){
  if(n<=1) return 1;
  if(n% 2 ==0) return calc(n / 2)+1;
  else return calc(n - 1)+ calc(n - 2);
}

{{ select(3) }}

  • 5
  • 6
  • 7
  • 8

4.用5个权值10,12,15,28,25构造哈夫曼树,该树的带权路径长度是多少?( ) {{ select(4) }}

  • 176
  • 186
  • 196
  • 206

5.在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和,这个总和等于?( ) {{ select(5) }}

  • 顶点数
  • 边数
  • 顶点数+边数
  • 顶点数*2
  1. 从5位男生和4位女生中选出4人组成一个学习小组,要求学习小组中男生和女生都有。有多少种不同的选举方法?( ) {{ select(6) }}
  • 126
  • 121
  • 120
  • 100

7.假设a,b,c都是布尔变量,逻辑表达式(a&&b)||(Ic&&a)的值与下列哪个表达式不始终相等?( ) {{ select(7) }}

  • a && (b || !c)
  • (a || !c) && (b || !c) && (a || a)
  • a && (!b || c)
  • (!a || !b) || (a && !c)

8.已知 f[0]=1, f[1]=1,f[n]=(f[n-1]+f[n-2])%7,求 f[2025]。 {{ select(8) }}

  • 2
  • 4
  • 5
  • 6

9.下列关于 C++ string 的说法正确的是? {{ select(9) }}

  • 长度固定
  • 可用 + 连接 string 和 char
  • length() 与 size() 可能不同
  • 必须以 \0 结尾且计入长度

10.调用后 x,y 的值?( )

void solve(int &a, int b) {
    a = a + b;
    b = a - b;
    a = a - b;
}
int main() {
    int x=5,y=10;
    solve(x,y);
}

{{ select(10) }}

  • 5,10
  • 10,5
  • 10,10
  • 5,5
  1. 一个 8x8 的棋盘,左上角坐标为(1,1),右下角为(8,8)。一个机器人从(1,1)出发,每次只能向右或向下走一格。要到达(4,5),有多少种不同的路径? {{ select(11) }}
  • 20
  • 35
  • 56
  • 78

12.某同学用冒泡排序对数组{6,1,5,2,4}进行升序排序,请问需要进行多少次元素交换?( ) {{ select(12) }}

  • 5
  • 6
  • 7
  • 8

13.十进制数 72010和八进制数 2708。的和用十六进制表示是多少?() {{ select(13) }}

  • 38816
  • 3DE16
  • 28816
  • 99016

14.一棵包含 1000 个结点的完全二叉树,其叶子结点的数量是多少?()

{{ select(14) }}

  • 499
  • 512
  • 500
  • 501

15.给定一个初始为空的整数栈S和一个空的队列P。我们按顺序处理输入的整数队列A:7,5,8,3,1,4,2。对于队列A中的每一个数,执行以下规则:如果该数是奇数,则将其压入栈S:如果该数是偶数,且栈S非空,则弹出一个栈顶元素,并加入到队列P的末尾:如果该数是偶数,且栈s为空,则不进行任何操作。当队列A中的所有数都处理完毕后,队列P的内容是什么?() {{ select(15) }}

  • 5,1,3
  • 7,5,3
  • 3,1,5
  • 5,1,3,7

二、阅读程序(程序输入不超过数组或字符串定义的范围:判断题正确填,错误填x;除特殊说明外,判断题1.5分,选择题3分,共计40分) 第 1 题

#include<algorithm>
#include<cstdio>
#include<cstring>
inline int gcd(int a,int b){
  if(b==0)
  return a;
  return gcd(b,a%b);
}
int main() {
  int n;
  scanf("%d",&n);
  int ans=0;
  for(int i=1;i<=n;++i){
    for(int j=i+1;j<=n;++j){
      for(int k=j+1;;k<=n;++k){
        if(gcd(i,j)==1 && gcd(j,k)==1 && gcd(i,k)==1){
          ++ans;
        }
      }
    }
  }
  printf("%d\n",ans);
  return 0;
}

1.当输入为2时,程序并不会执行第16行的判断语句。() {{ select(16) }}

  • 正确
  • 错误

2.将第16行中的“&& gcd(i,k)==1”删去不会影响程序运行结果。() {{ select(17) }}

  • 正确
  • 错误

3.sumPrimes 函数计算的是从2 到n 之间的所有素数之和。 {{ select(18) }}

  • 正确
  • 错误

4.当输入为50 时,sumPrimes(50) 的输出为( )。 {{ select(19) }}

  • 1060
  • 328
  • 381
  • 275
  1. 如果将 for (int i = 2; i * i <= n; i++) 改为 for (int i = 2; i <= n; i++),输入 10 时,程序的输出( )。 {{ select(20) }}
  • 将不能正确计算10 以内素数个数及其和
  • 仍然输出 4 和 17
  • 输出3 和10
  • 输出结果不变,但运行时间更短

第 2 题


1.当输入的 cost 数组为{10,15,20} 时,程序的输出为15。( )。( ) {{ select(21) }}

  • 正确
  • 错误

2.如果将 dp[i-1] 改为 dp[i-3],程序可能会产生编译错误。( ) {{ select(22) }}

  • 正确
  • 错误

3.(2 分)程序总是输出 cost 数组中最小的元素。( ) {{ select(23) }}

  • 正确
  • 错误

4.当输入的 cost 数组为{1,100,1,1,1,100,1,1,100,1} 时,程序的输出为( )。 {{ select(24) }}

  • 6
  • 7
  • 8
  • 9

5.(4 分)如果输入的 cost 数组为{10,15,30,5,5,10,20},程序的输出为( )。 {{ select(25) }}

  • 25
  • 30
  • 35
  • 40

6.若将代码中的 min(dp[i-1], dp[i-2]) + cost[i-1] 修改为 dp[i-1] + cost[i-2],输入 cost 数组为 {5,10,15} 时,程序的输出为( )。 {{ select(26) }}

  • 10
  • 15
  • 20
  • 25

第 3 题

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

int customFunction(int a, int b) {
    if (b == 0) {
        return a;
    }
    return a + customFunction(a, b-1);
}

int main() {
    int x, y;
    cin >> x >> y;
    int result = customFunction(x, y);
    cout << pow(result, 2) << endl;
    return 0;
}

1.当输入为 2 3 时,customFunction(2, 3) 的返回值为 64。( )。 {{ select(27) }}

  • 正确
  • 错误

2.当 b 为负数时,customFunction(a, b) 会陷入无限递归。( )。 {{ select(28) }}

  • 正确
  • 错误

3.当 b 的值越大,程序的运行时间越长。( )。 {{ select(29) }}

  • 正确
  • 错误

4.当输入为 5 4 时,customFunction(5, 4) 的返回值为( )。 {{ select(30) }}

  • 5
  • 25
  • 250
  • 625

5.如果输入 x=3 和 y=3,则程序的最终输出为( )。 {{ select(31) }}

  • 27
  • 81
  • 144
  • 256

6.若将 customFunction 函数改为 return a + customFunction(a-1, b-1);,并输入 3 3,则程序的最终输出为( ) {{ select(32) }}

  • 9
  • 16
  • 25
  • 36

三、完善程序(单选题,每小题 3 分,共计 30 分) 第 1 题 (判断平方数) 问题:给定一个正整数n,希望判断这个数是否为完全平方数,即存在一个正整数 x,使得x 的平方为n。

试补全程序。

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

bool isSquare(int num) {
    int i = ___①___;
    int bound = ___②___;
    for (; i <= bound; ++i) {
        if (___③___) {
            return ___④___;
        }
    }
    return___⑤___;
}

int main() {
    int n;
    cin >> n;
    if (isSquare(n)) {
        cout << n << " is a square number" << endl;
    } else {
        cout << n << " is not a square number" << endl;
    }
    return 0;
}

1.① 处应填( ) {{ select(33) }}

  • 1
  • 2
  • 3
  • 4

2.② 处应填( )。 {{ select(34) }}

  • (int)floor(sqrt(num))-1
  • (int)floor(sqrt(num))
  • floor(sqrt(num/2))-1
  • floor(sqrt(num/2))

3.③ 处应填( )。 {{ select(35) }}

  • num = 2 * i
  • num == 2 * i
  • num = i * i
  • num == i * i

4.④ 处应填( )。 {{ select(36) }}

  • num = 2 * i
  • num == 2 * i
  • true
  • false

5.⑤ 处应填( )。 {{ select(37) }}

  • num = i * i
  • num != i * i
  • true
  • false

第 2 题 (汉诺塔问题) 给定三根柱子,分别标记为 A、B 和 C。初始状态下,柱子 A 上有若干个圆盘,这些圆盘从上到下按从小到大的顺序排列。任务是将这些圆盘全部移到柱子 C 上,且必须保持原有顺序不变。在移动过程中,需要遵守以下规则:

只能从一根柱子的顶部取出圆盘,并将其放入另一根柱子的顶部。 每次只能移动一个圆盘。 小圆盘必须始终在大圆盘之上。 试补全程序。

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

void move(char src, char tgt) {
    cout << "从柱子" << src << "挪到柱子" << tgt << endl;
}

void dfs(int i, char src, char tmp, char tgt) {
    if (i == ___①___) {
        move(___②___;
        return;
    }
    dfs(i - 1, ___③___);
    move(src, tgt);
    dfs(___⑤___, ___④___);
}

int main() {
    int n;
    cin >> n;
    dfs(n, 'A', 'B', 'C');
}

1.① 处应填( )。 {{ select(38) }}

  • 0
  • 1
  • 2
  • 3

2.② 处应填( )。 {{ select(39) }}

  • src, tmp
  • src, tgt
  • tmp, tgt
  • tgt, tmp

3.③ 处应填( ) {{ select(40) }}

  • src, tmp, tgt
  • src, tgt, tmp
  • tgt, tmp, src
  • tgt, src, tmp

4.④ 处应填( )。 {{ select(41) }}

  • src, tmp, tgt
  • tmp, src, tgt
  • src, tgt, tmp
  • tgt, src, tmp

5.⑤ 处应填( ) {{ select(42) }}

  • 0
  • 1
  • i - 1
  • i