#ACSP1003. cspj-模拟题3

cspj-模拟题3

普及组CSP-J 2024 初赛模拟卷3

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

  1. 下列存储器按存取速度由快至慢排列,正确的是({{ select(1) }})。
  • 硬盘 >内存 >高速缓存 >U 盘
  • 高速缓存 >内存 >硬盘 >U盘
  • 高速缓存>硬盘 >内存>U 盘
  • U盘 >硬盘>内存 >高速缓存
  1. 杨辉三角形和({{ select(2) }})算法的思想最接近。
  • 贪心
  • 二分
  • DFS
  • 递推
  1. 下列属于输入设备的是({{ select(3) }})。
  • 显示器
  • 麦克风
  • 音箱
  • 打印机
  1. 小写字母a 的ASCII码值为97, 小写字母z的ASCII码值是({{ select(4) }})。
  • 120
  • 119
  • 122
  • 121
  1. IP 地址是每台上网的计算机所必需的,下列 IP 地址中可以作为合法主机地址的是({{ select(5) }})。
  • 225.225.225.225
  • 200.256.192.8
  • 192.168.1.12
  • 0.0.0.0
  1. 下面哪个可以用作C++程序中的标识符? ({{ select(6) }})
  • default
  • private
  • this
  • them
  1. 快速排序在最坏情况下运行的时间复杂度是({{ select(7) }})。
  • O(logn)
  • O(n)
  • O(n²)
  • O(nlogn)
  1. 字符串 a="98", 字符串 b="123", 使用 strcmp 函数, 比较两者大小的结果是({{ select(8) }})。
  • a大
  • b大
  • 一样大
  • 无法判断
  1. 关于计算机网络,下面的说法哪个是正确的? ({{ select(9) }})
  • 现在的计算机互联网是俄罗斯人发明的
  • 计算机网络拓扑结构只包括星形、流水线型和环形
  • TCP/IP 是因特网的最基本的协议
  • SMTP 属于物理层协议
  1. 关于信息安全与网络道德,下列做法正确的是({{ select(10) }})。
  • 确认环境安全后再输入支付密码
  • 随意点击不熟悉的电子邮件中的链接
  • 未经许可将其他人的私密照片和视频上传到互联网上
  • 在微信里随意转发未经证实的信息
  1. 现在有一个十进制算式13*64+7,它等于二进制数的({{ select(11) }})。
  • 1100100111
  • 1101001111
  • 1101000111
  • 1111101101
  1. 逻辑表达式 A=true, B=C=D=false, 则逻辑表达式取值为真的是({{ select(12) }})。
  • (A∧B)∨(C∧D∨¬A)
  • ¬ ((A∧B∨C)∧D)
  • A∧(B∨C∨D))∨D
  • (AV(CVD))∧B
  1. 某二叉树树根层次为0,则有64个结点的完全二叉树的高度是({{ select(13) }})。
  • 9
  • 8
  • 7
  • 6
  1. 书架上同一格放5本书,A和B必须相邻,C和D必须不相邻,不同的放法共有({{ select(14) }})种。
  • 24
  • 12
  • 18
  • 48
  1. 字符串S="abcdefgh"的子串个数为({{ select(15) }})。
  • 33
  • 35
  • 37
  • 36

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

(1)

#include<bits/stdc++. h>
using namespace std;
const int SIZE = 100007;
int a[SIZE], b[SIZE];
int main()
{
    int n, m, p, q, count=0, ret=0;
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
       cin >> p >> q;
       a[p]++;
       a[q+1]--;
    }
    for (int i = 1; i <= m; i++)
    {
       count += a[i];
       ret += count;
    }
    cout << ret;
    return 0;
}

判断题 16.将输入的p和q改成任意的整数,运行程序都不会出错。 ({{ select(16) }})

  • 正确
  • 错误

17.将第7行中的count=0去掉, 只定义 count变量, 程序的运行结果不会改变。 ({{ select(17) }})

  • 正确
  • 错误

18.将第17行和第18行互换位置,程序的运行结果不会发生变化。 ({{ select(18) }})

  • 正确
  • 错误

19.将第15行中的i = 1改为i = 0, 程序的运行结果不会改变。 ({{ select(19) }})

  • 正确
  • 错误

选择题

  1. 将第12~13行中的p和q+1分别改为p-1和q, 则输出结果({{ select(20) }})。
  • 变大
  • 变小
  • 不变
  • 可能变可能不变

21.若输入为 4 4 1 2 2 3 3 3 1 3, 则输出为({{ select(21) }})。

  • 6
  • 10
  • 7
  • 8

(2)


#include <bits/stdc++. h>
using namespace std;
bool fun(int n)
{
    int i=7;
    if(n==2 || n==3 || n==5)
        return true;
    if(n==1 || n%2==0 || n%3==0 || n%5==0)
        return false;
    while(i*i<=n)
    {
        if(n%i==0)
           return false;
        i += 4;
        if(n%i==0)
           return false;
        i += 2;
    }
    return true;
}
int main()
{
    int n,m;
    cin>>n>>m;
    if(fun(n) && fun(m) && fun(n+m+1))
       cout<<"YES"<<endl;
    else
       cout<<"NO"<<endl;
    return 0;
}

判断题

22.程序中 n和m只有输入正整数,程序的输出值才可能是 YES。 ({{ select(22) }})

  • 正确
  • 错误

23.程序中用到了递归函数 bool fun(int n)。 ({{ select(23) }})

  • 正确
  • 错误

24.若输入 n和 m都是素数,程序的输出值一定是YES。 ({{ select(24) }})

  • 正确
  • 错误

25.若输入n和m的值分别是-1 和2027, 则程序的输出值是YES。 ({{ select(25) }})

  • 正确
  • 错误

选择题

  1. 若输出YES, 则输入可能为({{ select(26) }})。
  • 23 29
  • 23 24
  • 23 27
  • 31 37

27.若输出 YES, 则输入可能为({{ select(27) }})。

  • 53 127
  • 2029 -1
  • 2023 2027
  • 97 41

(3)

#include<bits/stdc++. h>
using namespace std;
int main()
{
    stack<int> s;
    char a[1005];
    int back, front, result;
    cout << "Input: ";
    cin >> a;
    for (int i = 0; i < strlen(a); i++)
    {
        if (a[i] >= '0' && a[i] <= '9')
           s. push(a[i] - '0');
        else
        {
            back = s. top();
            s. pop();
            front = s. top();
            s. pop();
            if (a[i] == '+')
               result = front + back;
            else if (a[i] == '-')
               result = front - back;
            else if (a[i] == '*')
               result = front * back;
            else if (a[i] == '/')
               result = front / back;
            else if (a[i] == '%')
               result = front % back;
            s. push(result);
        }
    }
    cout << "Output: " << s. top() << endl;
    return 0;
}

判断题

  1. 将第1行改为#include, 程序的运行结果不变。 ({{ select(28) }})
  • 正确
  • 错误

29.本程序用到了队列而不是栈的思想。 ({{ select(29) }})

  • 正确
  • 错误

30.将第12行中的'0'替换为48,程序的运行结果不会改变。 ({{ select(30) }})

  • 正确
  • 错误

31.如果输入的都是非零数字和加、减、乘、除四则运算符号,那么运行程序输出的值一定是正整数。 ({{ select(31) }})

  • 正确
  • 错误

选择题

32.本题的主要思想是求({{ select(32) }})表达式的值。

  • 前缀
  • 后缀
  • 中缀
  • 逻辑

33.若输入 234--,那么程序的输出结果是({{ select(33) }})。

  • 3
  • 2
  • 1
  • 0

34.(4分) 若输入数据为 5432*%/, 则输出是({{ select(34) }})。

  • 3
  • 2
  • 1
  • 0

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

(1)输入两个正整数n和m(1<n<10, 1<m<n), 在1~n这n个数中任取m个数,按字典序从小到大输出所有这样的排列。

输入格式:

第1行输入n和m。

输出格式:

输出从n个数中挑出m个数组成的所有排列,按从小到大的顺序输出。

输入样例:

4 3

输出样例:

123
124
132
134
142
143
213
214
231
234
241
243
312
314
321
324
341
342
412
413
421
423
431
432
#include<bits/stdc++. h>
using namespace std;
const int MAXN = 15;
bool flag, vis[MAXN];
int n,m,i,j,k,a[MAXN];
int main()
{
    cin>>n>>m;
    memset(vis, false, sizeof(vis));
    for(i=1;i<=m;i++)
    {
        a[i]=i;
        vis[i]=true;
    }
    flag=true;
    while(flag)
    {
        for(i=1;i<=m-1;i++)
            cout<<a[i]<<" ";
        cout<<a[m]<<endl;
        ①;
        for(i=m;i>=1;i--)
        {
            ②;
            for(j=a[i]+1;j<=n;j++)
                if(!vis[j])
                {
                    vis[j]=true;
                    ③;
                    flag=true;
                    break;
                }
            if(flag)
            {
                for(k=i+1;k<=m;k++)
                    for(j=1; ④ ;j++)
                        if(!vis[j])
                        {
                            a[k]=j;
                            vis[j]=true;
                            break;
                        }
                ⑤ ;
            }
        }
    }
    return 0;
}

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

  • flag = false
  • flag = true
  • vis[1] = false
  • vis[1] = true

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

  • vis[i] = true
  • a[i] = i
  • vis[a[i]] = true
  • vis[a[i]] = false

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

  • a[i] = i
  • a[i] = j
  • a[i] = true
  • a[i] = false

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

  • j<=m
  • j<=k
  • j<=n
  • j<=i

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

  • exit
  • return 0
  • continue
  • break

(2)求一个有向图中有多少个环并输出环的总数。

输入格式:

第1行为n,第2行为n个点的编号。

输出格式:

输出有向图的环的总数。

输入样例:

10

7 1 4 3 2 5 9 8 0 6

输出样例:

6

样例说明:

a[0]=7,a[7]=8,a[8]=0,{0,7,8}构成一个环;

a[1]=1,{1}构成一个环;

a[2]=4,a[4]=2,{2,4}构成一个环;

a[3]=3,{3}构成一个环;

a[5]=5,{5}构成一个环;

a[6]=9,a[9]=6,{6,9}构成一个环。

该有向图共有6个环。

#include<bits/stdc++. h>
using namespace std;
int n, point[100];
bool vis[100];
int main()
{
    int cnt;
    scanf("%d", &n);
    for (int i = 0; i < n; ++i)
    {
        scanf("%d", ①);
        ②;
    }
    cnt = 0;
    for (int i = 0; i < n; ++i)
    {
        if (③)
        {
            for (int j = i; !vis[j]; ④)
            {
                vis[j] = true;
            }
            ⑤;
        }
    }
    printf("%d", cnt);
    return 0;
}

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

  • &point
  • point + i
  • &point + i
  • point[i]

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

  • vis[j] = false
  • vis[j] = true
  • vis[i] = true
  • vis[i] = false

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

  • !vis[i]
  • vis[i]
  • !vis[point[i]]
  • vis[point[i]]

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

  • j = point[i]
  • j = point[j]
  • i = point[j]
  • i = point[i]

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

  • cnt = j+1
  • cnt = n-j
  • ++cnt
  • cnt = n-i