#ACSP1008. cspj-模拟题8

cspj-模拟题8

普及组CSP-J2024 初赛模拟卷

一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)

  1. 在C++语言中,以下哪种方式不能用于向函数传递参数?({{ select(1) }})
  • 值传递
  • 模板传递
  • 引用传递
  • 指针传递
  1. 以下关于算法的描述中正确的是({{ select(2) }})。
  • 算法是为解决问题而编制的计算机程序
  • 算法是为解决问题而采用的计算机程序设计语言
  • 算法是为解决问题而采用的计算方法
  • 算法是为解决问题而采取的方法与步骤
  1. 在关系数据库中,存放在数据库中的数据的逻辑结构以({{ select(3) }})为主。
  • 二维表
  • 二叉树
  • 哈希表
  • 邻接表
  1. 设某算法的时间复杂度函数的递推方程是 T(n)=T(n-1)+n(n为正整数)及 T(0)=1,则该算法的时间复杂度为({{ select(4) }})。
  • O(logn)
  • O(n)
  • O(n²)
  • O(nlogn)
  1. 在C++语言中,一般提到的“空间复杂度”中的“空间”是指({{ select(5) }})。
  • 程序运行时所占的内存大小
  • 程序运行时所占的数组大小
  • 程序运行时所占的硬盘大小
  • 程序源文件所占的硬盘大小
  1. 2017年9月30日是星期六, 1999年9月30 日是({{ select(6) }})。
  • 星期三
  • 星期六
  • 星期五
  • 星期四
  1. 设栈S的初始状态为空,元素1,2,3,4,5依次入栈,以下出栈序列中不可能出现的是({{ select(7) }})。
  • 1,2,3,5,4
  • 2,3,1,5,4
  • 1,5,3,2,4
  • 4,3,5,2,1
  1. 关于分治算法,下列说法中错误的是({{ select(8) }})。
  • 分治算法的核心思想是分而治之,把问题转化为多个规模更小的子问题再求解
  • 分治算法可以不使用递归实现
  • 分治算法的时间复杂度是O(logn),其中n表示问题的规模
  • 二分法、快速排序等算法都是使用分治思想的典型算法
  1. 如下代码主要表示什么数据结构?({{ select(9) }})
    typedef int LTDataType;
    typedef struct ListNode {
        struct ListNode* prev;
        struct ListNode* next;
        LTDataType data;
    } LTNode;
    
  • 单向链表
  • 双向链表
  • 循环链表
  • 优先队列

10.使用如下代码片段定义4个字符串(假设头文件已正确定义),以下说法中错误的是({{ select(10) }})。

  • 对于4个字符串, 都可以使用std::cout输出其中的内容(例如, cout<<str3;)
  • str3只占用4字节内存,但str1要占用更多内存
  • 由于 str2 由str1直接赋值得到,因此二者指向同一块内存,即修改 str1 的内容后 str2的内容也会随之改变
  • 由于 str4 由str3直接赋值得到,因此二者指向同一块内存,即修改 str3的内容后 str4的内容也会随之改变
    string str1 = "csp";
    string str2 = str1;
    char str3[] = "csp";
    char * str4 = str3;
    

11.冯·诺依曼体系结构中组成计算机的五大部件是({{ select(11) }})。

  • 总线、处理器、存储器、输入设备、输出设备
  • 处理器、运算器、存储器、输入设备、输出设备
  • 总线、控制器、存储器、输入设备、输出设备
  • 控制器、运算器、存储器、输入设备、输出设备

12.如下代码对树的操作是({{ select(12) }})。

  • 后序遍历
  • 中序遍历
  • 前序遍历
  • 层次遍历
    void postorder(tree bt) {
       if(bt) {
           postorder(bt->lchild);
           postorder(bt->rchild);
           cout << bt->data;
       }
    }
    

13.有规格尺寸相同的5种颜色的手套(不分左右)各 15 只混装在箱子里,从中至少取出多少只,才能保证配出3副颜色相同的手套?({{ select(13) }})

  • 8
  • 9
  • 10
  • 11

14.由3个a、5个b和2个c构成的字符串中, 包含子串"abc"的共有({{ select(14) }})个。

  • 39600
  • 780
  • 840
  • 260

15.1 GB 代表的字节数量是({{ select(15) }})。

  • 210
  • 220
  • 230
  • 240

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

(1)

#include<bits/stdc++. h>
using namespace std;
const int SIZE = 25;
int n,k,a[SIZE];
int cnt=0;
long long ans;
bool isPrime(int n) {
    cnt++;
    cout<<cnt<<endl;
    if(n<=1) return false;
    for(int i=2;i*i<=n;++i)
        if(0==n%i) return false;
    return true;
}
void dfs(int m, int sum, int x) {
    if(m==k) {
        if(isPrime(sum)) {
            ans++;
        }
        return;
    }
    for(int i=x;i<n;++i)
        dfs(m+1, sum+a[i],i+1);
    return;
}
int main() {
    cin >> n >> k;
    for (int i = 0; i < n;++i)
        cin >> a[i];
    dfs(0,0,0);
    cout << ans <<endl;
    return 0;
}

判断题

16.将第13行中的i*i<=n改为i<=sqrt(n), 程序的运行结果 不会改变。({{ select(16) }})

  • 正确
  • 错误

17.将第14行中的if(0==n%i)改为if(n%i==0), 程序的运行结果不会改变。({{ select(17) }})

  • 正确
  • 错误

18.若输入k值比n大,则程序会死循环,无输出。({{ select(18) }})

  • 正确
  • 错误

19.将第29行中的sum+a[i]改为 sum+=a[i], 程序的运行结果不会改变。({{ select(19) }})

  • 正确
  • 错误

选择题

20.若输入k的值为6,且输入 n>=k,a数组的元素均为相等的正整数,则输出为({{ select(20) }})。

  • 0
  • 2
  • 4
  • 8

21.若输入 12 8, 则isPrime被调用的次数为({{ select(21) }})。

  • 4
  • 66
  • 132
  • 495

(2)

#include <bits/stdc++. h>
using namespace std;
int CNT, p;
int check(int tmp, int n) {
    int res = 0;
    for(int i=tmp; i>0; i--) {
        res += n;
        int a=0, ans=res;
        while(ans%n == 0)
            a++, ans/=n;
        i -= a-1;
    }
    return res;
}
int main() {
    cin >> CNT;
    while(CNT--) {
        int ans=1;
        cin >> p;
        for(int i=2; i<=sqrt(p); i++) {
            int tmp=0;
            while(p%i == 0)
                tmp++, p/=i;
            if(tmp)
                ans = max(ans, check(tmp,i));
        }
        ans = max(ans,p);
        cout<<ans<<endl;
    }
    return 0;
}

判断题

22.若输入1 2,程序的输出会报错。({{ select(22) }})

  • 正确
  • 错误

23.若将第27行中的while 改为if, 程序的输出结果不变。({{ select(23) }})

  • 正确
  • 错误

24.若输入p是一个素数,则程序中的第30行不会被执行。({{ select(24) }})

  • 正确
  • 错误

25.若输入p是一个素数,则输出ans的值为p。({{ select(25) }})

  • 正确
  • 错误

选择题

26.若输入1 36, 则输出为({{ select(26) }})。

  • 36
  • 6
  • 4
  • 9

27.若tmp < n, 则返回的res结果为({{ select(27) }})。

  • n
  • tmp
  • tmp*n
  • tmp+n

(3)

#include<iostream>
#include<string>
#include<set>
using namespace std;
string a, s[105];
int cnt=0;
set<string>dict;
void trim(string &s) {
    if(!s.empty()) {
        s.erase(0,s.find_first_not_of(" "));
        s.erase(s.find_last_not_of(" ")+1);
    }
}
int main() {
    cin>>a;
    while(a!="#") {
        int length = a.length();
        for(int i=0;i<length;i++)
            if(isalpha(a[i]))
                a[i] = tolower(a[i]);
            else
                a[i] = ' ';
        trim(a);
        s[cnt]=a;
        dict.insert(a);
        cnt++;
        cin>>a;
    }
    for(set<string>::iterator it=dict.begin();it!=dict.end();++it)
        cout << *it << " ";
    return 0;
}

判断题

28.STL 中的set属于关联式容器。({{ select(28) }})

  • 正确
  • 错误

29.若将第6行中的int cnt=0替换为int cnt, 程序的运行结果不会改变。({{ select(29) }})

  • 正确
  • 错误

30.若将第21行中的a.length()替换为a.size(), 程序的运行结果不会改变。({{ select(30) }})

  • 正确
  • 错误

31.若输入34 12 56 #, 则程序输出12 34 56。({{ select(31) }})

  • 正确
  • 错误

选择题

32.若输入为A Dream Is To Build A Big Big World #, 则输出是({{ select(32) }})。

  • A Dream Is To Build A Big Big World
  • a dream is to build a big big world
  • a big build dream is to world
  • A Big Build Dream Is To World

33.若输入为 WorldYiwu AsiaShanghai ChinaHangzhou ZhejiangJinhua #, 则输出是({{ select(33) }})。

  • WorldYiwu AsiaShanghai ChinaHangzhou ZhejiangJinhua
  • worldyiwu asiashanghai chinahangzhou zhejiangjinhua
  • AsiaShanghai ChinaHangzhou WorldYiwu ZhejiangJinhua
  • asiashanghai chinahangzhou worldyiwu zhejiangjinhua

34.若输入为I am 12 years old. #, 则输出是({{ select(34) }})。

  • am i old years
  • am I old years
  • I am years old.
  • I am 12 years old.

三、完善程序(单选题,每小题3分,共计30分)

(1)

假设有一个无向图,将这个无向图的某一条欧拉路或者欧拉回路用算法实现并打印出来。

无向图G存在欧拉通路的充要条件是:G为连通图,并且G仅有两个奇度节点(度数为奇数的顶点)或者无奇度节点。

当G是仅有两个奇度节点的连通图时,G的欧拉通路必以此两个节点为端点

当G是无奇度节点的连通图时,G必有欧拉回路

为欧拉图(存在欧拉回路)的充分必要条件是G为无奇度节点的连通图

提示:欧拉通路/回路的算法流程,选择一个正确的起始顶点,用DFS算法遍历所有的边(每条边只遍历一次),遇到走不通就回退。在搜索前进方向上将遍历过的边按顺序记录下来。这组边的排列就组成了一条欧拉通路或回路。

输入格式:

第1行是n和m,表示有n个点和m条边,以下m行描述每条边连接的两点。

输入样例:

5 5
1 2
2 3
3 4
4 5
5 1

输出格式:

欧拉路或欧拉回路。

输出样例:

1 5 4 3 2 1

#include<bits/stdc++. h>
using namespace std;
#define MAXN 105
int g[MAXN][MAXN];
int du[MAXN];
int circuit[MAXN];
int n,e, circuitpos,x,y, start;
void find_circuit(int i) {
    for (int j = 1; j <= n; j++)
        if (①) {
            g[j][i] = 0;
            g[i][j] = 0;
            find_circuit(j);
        }
    ②;
}
int main() {
    memset(g,0, sizeof(g));
    cin >> n >> e;
    for (int i = 1; i <= e; i++) {
        cin >> x >> y;
        g[y][x] = 1;
        ③;
        du[x]++;
        du[y]++;
    }
    start = 1;
    for (int i = 1; i <= n; i++)
        if (④)
            start = i;
    circuitpos = 0;
    ⑤;
    for (int i = 1; i <= circuitpos; i++)
        cout << circuit[i] << ' ';
    cout << endl;
    return 0;
}

35.①处应填({{ select(35) }})。

  • g[i][j] == 0
  • g[i][j] == 1
  • du[i] == 1
  • du[j] == 1

36.②处应填({{ select(36) }})。

  • circuit[++circuitpos] = i
  • circuit[circuitpos] = i
  • circuit[j] = i
  • circuit[i] = j

37.③处应填({{ select(37) }})。

  • start=1
  • start=0
  • g[x][y]=1
  • g[x][y]=0

38.④处应填({{ select(38) }})。

  • g[i][j] % 2 == 0
  • g[i][j] % 2 == 1
  • du[i] % 2 == 0
  • du[i] % 2 == 1

39.⑤处应填({{ select(39) }})。

  • find_circuit(0)
  • find_circuit(start)
  • find_circuit(1)
  • find_circuit(n)

(2)

设一棵n结点的二叉树tree 的中序遍历为(1,2,3,…,n), 其中数字1,2,3,…,n为结点编号。每个结点都有一个分数(均为正整数),记第 i个结点的分数为 d₁,tree 及它的每棵子树都有一个加分,任意一棵子树subtree(也包含 tree 本身)的加分计算方法如下:

subtree 的左子树的加分×subtree 的右子树的加分+subtree的根的分数

若某棵子树为空,规定其加分为1。叶子的加分就是叶子结点本身的分数,不考虑它的空子树。

试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树 tree。

要求输出:(1) tree的最高加分;(2) tree 的前序遍历。

输入格式:

第1行是一个整数n,为结点个数。第2行是 n个用空格隔开的整数,为每个结点的分数(0<分数<100)。

输出格式:

第1行是一个整数,为最高加分(结果不会超过int范围)。

第2行是n个用空格隔开的整数,为该树的前序遍历。如果存在多种方案,则输出字典序最小的方案。

数据范围:n<30。

输入样例:

5
5 7 1 2 10

输出样例:

145
3 1 2 4 5
#include<bits/stdc++. h>
using namespace std;
const int N=30;
int n, w[N], f[N][N], rt[N][N];
void print(int l, int r) {
    if(l > r) return;
    ①;
    printf("%d ", root);
    ②;
    print(root+1, r);
}
int main() {
    memset(f,0, sizeof(f));
    scanf("%d", &n);
    for (int i=1; i<=n; ++i) {
        scanf("%d", &w[i]);
        ③;
        rt[i][i] = i;
    }
    for (int l=n; l>=1; l--)
        for(int r=l+1; r<=n; r++)
            for(int root=l; root<=r; root++) {
                int lw=f[l][root-1];
                ④;
                if(lw == 0) lw = 1;
                if(rw == 0) rw = 1;
                if( ⑤ ) {
                    f[1][r] = lw*rw+w[root];
                    rt[l][r] = root;
                }
            }
    printf("%d\n", f[1][n]);
    print(1, n);
    printf("\n");
    return 0;
}

40.①处应填({{ select(40) }})。

  • int root = 0
  • int root = 1
  • int root = rt[l][r]
  • int root = rt[1][n]

41.②处应填({{ select(41) }})。

  • print(1, root-1)
  • print(l, root-1)
  • print(1, root)
  • print(l, root)

42.③处应填({{ select(42) }})。

  • f[i][i] = 0
  • f[i][i] = 1
  • f[i][i] = i
  • f[i][i] = w[i]

43.④处应填({{ select(43) }})。

  • int rw=f[root][r]
  • int rw=f[root+1][r]
  • int rw=f[root][n]
  • int rw=f[root+1][n]

44.⑤处应填({{ select(44) }})。

  • lw*rw+w[root] > f[l][r]
  • lw*rw+w[root] < f[l][r]
  • lw*rw+w[root] > f[1][n]
  • lw*rw+w[root] < f[1][n]