#CSPJHT04. CSPJHT初赛模拟4

CSPJHT初赛模拟4

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

  1. 十六进制数 1A2B3C 转换成八进制数字是 ()。 {{ select(1) }}
  • A、64254746425474
  • B、66212546621254
  • C、17150041715004
  • D、25100142510014
  1. 数字 189189273273 的最大公因数是() {{ select(2) }}
  • A、1313
  • B、1717
  • C、2929
  • D、2121
  1. 定义只有一个节点的二叉树深度为11,深度为55的二叉树上最多的节点数和最少的节点数之间的差值为() {{ select(3) }}
  • A、1515
  • B、1616
  • C、2626
  • D、3131
  1. 一个连通的无重边的无向图中有55个节点,图中最多可以有()条不同的边。 {{ select(4) }}
  • A、1010
  • B、2020
  • C、88
  • D、1616
  1. 顺序控制结构的程序执行过程是()依次执行的。 {{ select(5) }}
  • A、自上而下
  • B、自下而上
  • C、自内而外
  • D、自外而内
  1. 一棵树的前序遍历为 ABDEFCGH, 中序遍历为 DFEBAGCH,此树的后序遍历为()。 {{ select(6) }}
  • A、FEBGDHCA
  • B、FEDBGHCA
  • C、FDEBGHCA
  • D、FEDBGCHA
  1. 现有一个三位数字,不包含数字00,相邻的两个数位上的数字不能相同。符合这个要求的数字共有()个。{{ select(7) }}
  • A、890890
  • B、881881
  • C、729729
  • D、576576
  1. 四个歌手争论谁的歌唱的最好听,每个人可以投票给一位唱的最好听的人,允许投票给自己。假定每个人投票给所有人的概率都是相同的,求有多大可能四个歌手一人一票。 (){{ select(8) }}
  • A、3/323/32
  • B、1/161/16
  • C、1/41/4
  • D、5/165/16
  1. 对下列代码说法正确的是()
int func(int x, int y) {
    if(x > y) return x;
    else return func(x / y, x * y);
}

{{ select(9) }}

  • A、对于传入的两个int范围下的正整数,只要保证xy不相等,该函数就可以正常返回值。
  • B、该函数传入两个int范围下的负整数,一定无法正常返回值。
  • C、该函数调用中xy任意一个只要传入00,一定无法正常返回值。
  • D、对于传入的两个int范围下的整数xy,若 x=yx = -y,存在方案使得函数正常返回值。
  1. 四个有标号的节点之间连线,要求两个节点之间不能重复连线,连两条线的不同方法有()种 {{ select(10) }}
  • A、1010
  • B、2020
  • C、1515
  • D、3030
  1. 对下列代码,正确的输出是()
#include <iostream>
using namespace std;

void func(int a, int& b) {
    a += 10;
    b += 10;
}

int main() {
    int x = 5, y = 5;
    func(x, y);
    cout << x << " " << y;
    return 0;
}

{{ select(11) }}

  • A、55 55
  • B、1515 55
  • C、55 1515
  • D、1515 1515
  1. 已知一个机器人需要从网格的左上角(0, 0)移动到右下角(终点),每次只能向右或向下移动一格。若网格有mn列,定义 dp[i][j] 为从起点到位置 (i,j) 的不同路径数,则状态转移方程正确的是? {{ select(12) }}
  • A、dp[i][j] = dp[i-1][j] + dp[i][j-1]
  • B、dp[i][j] = dp[i-1][j] - dp[i][j-1]
  • C、dp[i][j] = dp[i-1][j] × dp[i][j-1]
  • D、dp[i][j] = dp[i-1][j] + dp[i][j-1] + 1
  1. 下列是一个合法的电子邮件的是? {{ select(13) }}
  • A、www.ccf.com
  • B、ftp://ccf.com
  • C、ccf@ccf.com
  • D、CCF#www.ccf.com
  1. 给定一个栈的初始状态为空,执行以下操作序列:
入栈 3
入栈 1
入栈 4
出栈
入栈 2
出栈
出栈
入栈 5
出栈

操作结束后,栈顶元素是() {{ select(14) }}

  • A、33
  • B、11
  • C、44
  • D、22
  1. 双向链表中有两个指针域 llinkrlink,分别指向该结点的前驱和后继。 设 p 指向链表中的一个结点,它的左右结点均非空。现要求删除结点 p,则下面语句序列中错误的是( )。 {{ select(15) }}
  • A、p->llink->rlink=p->rlink;p->rlink->llink=p->llink;delete(p)
  • B、p->rlink->llink=p->rlink;p->llink->rlink=p->llink;delete(p)
  • C、p->rlink->llink=p->llink;p->rlink->llink->rlink=p->rlink;delete(p)
  • D、p->llink->rlink=p->rlink;p->llink->rlink->llink=p->llink;delete(p)

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

(一)阅读下列程序,回答问题。

1  #include <iostream>
2  using namespace std;
3  
4  int main() {
5  int n, sum = 0;
6  cin >> n;
7  for (int i = 1; i <= n; i++) 
8      for(int j = i;j <= n; j *= 2)
9          sum++;
10  cout << sum << endl;
11  return 0;
12 }

判断题

  1. 当输入n=10n=10时,程序输出的结果为1818。() {{ select(16) }}
  • A、正确
  • B、错误
  1. (3分)若输入的n=0n=0,程序会陷入死循环。() {{ select(17) }}
  • A、正确
  • B、错误

单选题

  1. 当输入n=100n=100时,程序输出的结果为() {{ select(18) }}
  • A、9797
  • B、100100
  • C、197197
  • D、200200
  1. (4分)输出答案在[10,15][10, 15]之间的对应合法输入有()种
    {{ select(19) }}
  • A、11
  • B、22
  • C、33
  • D、44

###(二)阅读下列程序,回答问题。

1  #include <bits/stdc++.h>
2  using namespace std;
3  using ll = long long;
4  const int S = 1 << 26;
5
6  ll n, res, dp;
7  ll f[S];
8  string s;
9
10 int main() {
11 cin >> s;
12 n = s.size();
13 for (int i = 0; i < n; i++) {
14   dp ^= (1 << (s[i] - 'a'));
15   if (dp == 0) res++;
16   res += f[dp];
17   f[dp]++;
18 }
19  cout << res << '\n';
20  return 0;
21 }

合法的输入为一个长度不超过10510^5的仅含有小写字母的字符串。

判断题

  1. 输入字符串"aabb"时,程序输出"4"。() {{ select(20) }}
  • A、正确
  • B、错误
  1. 对于任意长度为11的小写字母构成的字符串,程序均会输出"0"。() {{ select(21) }}
  • A、正确
  • B、错误
  1. (3分)对于任意长度为22的小写字母构成的字符串,程序输出"1"的不同字符串共有2626种。() {{ select(22) }}
  • A、正确
  • B、错误

选择题

  1. 选出下列字符串中执行结果和其他不同的一项()
    {{ select(23) }}
  • A、ggbcdc
  • B、efaafb
  • C、baacba
  • D、cdcdab
  1. (4分)该程序段的功能为() {{ select(24) }}
  • A、计数所有非空的字母出现次数均为偶数的允许不连续的子序列数量。
  • B、计数所有可以为空的字母出现次数均为偶数的允许不连续的子序列数量。
  • C、计数所有非空的字母出现次数均为偶数的连续的子序列数量。
  • D、计数所有可以为空的字母出现次数均为偶数的连续的子序列数量。

###(三)阅读下列程序,回答问题

1  #include<iostream>
2  using namespace std;
3  int a, b, x, y; 
4  int main(){
5      cin >> a >> b; 
6      while(1){
7           x = a ^ b; 
8           y = a & b;
9           if(y == 0) break; 
10         a = x;
11         b = y << 1;
12     }
13     cout << x << endl; 
14     return 0;
15 }

其中输入保证 0<=a,b<=1090 <= a,b <= 10^9

判断题

  1. 1111 行的 << 和第 1313 行的 << 意义相同。( ) {{ select(25) }}
  • A、正确
  • B、错误
  1. 77 行计算得到的 x 每次比上一次计算得到的大。( ) {{ select(26) }}
  • A、正确
  • B、错误
  1. (3分)存在一组满足输入限制下的 a, b 使程序会陷入死循环。( ) {{ select(27) }}
  • A、正确
  • B、错误

单选题

  1. 如果输入的 a=155,b=229a=155,b=229,那么第 1010 行的代码会执行( )次。 {{ select(28) }}
  • A、77
  • B、88
  • C、99
  • D、1010
  1. (4分)设 n=max(a,b)n=max(a,b),最坏情况下,此程序的时间复杂度是( ) {{ select(29) }}
  • A、O(n)O(n)
  • B、O(logn)O(logn)
  • C、O(nlogn)O(nlogn)
  • D、O(n)O(\sqrt{n})

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

###(一)完善程序第一题 现在有nn个岛屿,每个岛屿上有一个权值。若两个岛屿的权值之差的绝对值小于等于maxKmaxK,则两个岛屿之间具有一条双向边。 现在,给定所有岛屿的权值,一共有qq次询问,你的任务是对于每次询问求出两个岛屿能否经过双向边互相抵达,能抵达给出Yes,不能给出No。 其中1n,q50001 \le n, q \le 5000

1  #include <bits/stdc++.h>
2  using namespace std;
3  const int N = 5005;
4  struct node {
5  int index, value;
6  bool operator < (const node &tmp) const {
7      _______30_______
8      };
9  };
10
11 node nodes[N]; int n, maxK, p[N];
12
13 int main() {
14 cin >> n >> maxK;
15 for(int i = 1; i <= n; ++i) {
16    cin >> nodes[i].value;
17    nodes[i].index = i;
18  }
19
20  _______31_______ 
21 for(int i = 1;i <= n; ++i)
22      _______32_______ 
23  int q; cin >> q;
24  for(int i = 1;i <= q; ++i) {
25    int u, v;
26    cin >> u >> v;
27    _______33_______
28    if(u > v) swap(u, v); 
29    bool flag = 1; 
30    for(int j = u + 1;j <= v; ++j)
31        if(_______34_______) 
32            flag = 0;
33    cout << (flag ? "Yes" : "No") << endl;
34   }
35   return 0;
36 }

选择题(每个空有A、B、C、D四个选项)

  1. 3030处应填入() {{ select(30) }}
  • A、return value < tmp.value;
  • B、return index < tmp.index;
  • C、return value > tmp.value;
  • D、return abs(value - tmp.value) <= maxK;
  1. 3131处应填入()
    {{ select(31) }}
  • A、sort(nodes, nodes + n);
  • B、sort(nodes + 1, nodes + n);
  • C、sort(nodes, nodes + n + 1);
  • D、sort(nodes + 1, nodes + n + 1);
  1. 3232处应填入()
    {{ select(32) }}
  • A、p[i] = nodes[i].index;
  • B、p[nodes[i].index] = i;
  • C、p[i] = nodes[i].value;
  • D、p[nodes[i].value] = i;
  1. 3333处应填入() {{ select(33) }}
  • A、u = nodes[u].value, v = nodes[v].value;
  • B、u = nodes[u].index, v = nodes[v].index;
  • C、swap(u, v);
  • D、u = p[u], v = p[v];
  1. 3434处应填入()
    {{ select(34) }}
  • A、nodes[j].value - nodes[u].value > maxK
  • B、nodes[v].value - nodes[j].value > maxK
  • C、nodes[j].value - nodes[j - 1].value > maxK
  • D、nodes[j - 1].value - nodes[j].value > maxK

(二)完善程序第二题

给定一个仅有大写字母的字符串,现在可以对字符串中的字符进行mm次操作,每次操作为下列三种之一:

  • 修改一个位置上的字符
  • 在任意位置(包括串头和串尾)插入一个字符
  • 删去一个字符

求字符串中最多的ABB串数。其中,1m1091 \le m \le 10^9

1  #include <bits/stdc++.h>
2  using namespace std;
3
4  int solution(string &s, int m)
5  {
6  int n = s.size();
7  int ans = 0;
8  vector<int> vis(n, 0);
9  for (int i = 2; i < n; ++i)
10 {
11    if (s[i] != 'A' && s[i] != 'B')
12        _______35_______
13    if (s[i - 2] == 'A' && s[i - 1] == 'B' && s[i] == 'B')
14        _______36_______
15 }
16 for (int i = 1; i < n; ++i)
17 {
18    if (m && !vis[i] && !vis[i - 1] &&
19        ((s[i - 1] == 'A' && s[i] == 'B') || (_______37_______)))
20        vis[i] = vis[i - 1] = 1, ans++, m--;
21 }
22
23  for (int i = 2; i < n; ++i)
24 {
25    if (m && !vis[i] && !vis[i - 1] && !vis[i - 2] &&
26        ((s[i - 2] == 'A' && s[i - 1] == 'T' && s[i] == 'B')))
27        vis[i] = vis[i - 1] = vis[i - 2] = 1, ans++, m--;
28 }
29
30 for (int i = 0; i < n; ++i)
31 {
32     if (_______38_______ && !vis[i] && (s[i] == 'A' || s[i] == 'B'))
33         vis[i] = 1, ans++, m -= 2;
34 }
35
36 if (m)
37     _______39_______
38
39 return ans;
40 }
41
42 int main()
43 {
44 int n, m;
45 string s;
46 cin >> n >> m >> s;
47 cout << solution(s, m);
48 return 0;
49 }
  1. 3535处应填入()
    {{ select(35) }}
  • A、s[i] = 'A';
  • B、s[i] = 'B';
  • C、vis[i] = 1;
  • D、s[i] = 'T';
  1. 3636处应填入() {{ select(36) }}
  • A、vis[i] = 1, ans++;
  • B、vis[i - 1] = vis[i] = 1, ans++;
  • C、vis[i - 2] = vis[i - 1] = vis[i] = 1, ans++;
  • D、ans++;

37.3737处应填入()
{{ select(37) }}

  • A、s[i - 1] == 'B' && s[i] == 'B'
  • B、s[i - 1] == 'A' && s[i] == 'A'
  • C、s[i - 1] == 'B' && s[i] == 'A'
  • D、s[i - 1] == 'T' && s[i] == 'B'
  1. 3838处应填入()
    {{ select(38) }}
  • A、m >= 1
  • B、m > 0
  • C、m >= 2
  • D、i < n-2
  1. 3939处应填入()
    {{ select(39) }}
  • A、ans += m;
  • B、ans += m / 3;
  • C、ans += m * 3;
  • D、ans += m % 3;