#YHCSPJ0004. CSP-J模拟卷4

CSP-J模拟卷4

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

  1. 以下不能用 ASCII 码表示的字符是( )。{{ select(1) }}
  • @
  • ^
  • ~
  1. 以下描述正确的是( )。{{ select(2) }}
  • 在 CSP-J 中,认证选手可以携带字典和词典
  • CSP-J 的认证选手可携带已关机的手机放在自己身边的包里
  • CSP-J 的认证选手在认证时间内上厕所的时候可携带手机
  • CSP-J 全称是 CCF CSP 非专业级别的能力认证入门级
  1. 以下哪个名字可以用做 C++ 程序中的变量名?( )。{{ select(3) }}
  • python
  • new
  • class
  • public
  1. 现在有表示 CSP-J/S 考试日期的整型变量testday = 20240921 ,下面能得到月份数值 9 的代码是( )。{{ select(4) }}
  • testday / 1000 % 100
  • testday / 100 % 1000
  • testday / 100 % 100
  • testday % 100 / 100
  1. 小明和小杨轮流掷硬币(假设每次掷硬币都符合古典概率模型,每次掷硬币正面朝上和反面朝上的概率都是 1/2 ),小明先掷,如果谁先掷到正面算谁赢。请问小明赢的概率是( )。{{ select(5) }}
  • 2/3
  • 1/2
  • 1/3
  • 3/4
  1. 小明用递归的方法写了一个关于汉诺塔的程序。能够描述递归过程的数据结构是( )。{{ select(6) }}
  • 链表
  • 队列
  1. 堆排序在最坏情况下运行的时间复杂度是( )。{{ select(7) }}
  • O(logn)O(\log n)
  • O(n)O(n)
  • O(n2)O(n^2)
  • O(nlogn)O(n\log n)
  1. 设变量sdouble 型且已赋值,下列哪条语句能将s 中的数值保留到小数点后一位,并将第二位四舍五入?( )。{{ select(8) }}
  • s = (s * 10 + 0.5) / 10.0
  • s = s * 10 + 0.5 / 10.0
  • s = (s / 10 + 0.5) * 10.0
  • s = (int)(s * 10 + 0.5) / 10.0
  1. 关于计算机网络,下面的说法哪些是正确的?( )。{{ select(9) }}
  • TCP 协议对应数据链路层
  • IP 协议对应传输层
  • HTTP 协议对应应用层
  • 接入互联网的计算机的 IP 地址已经大部分从 IPv5 升级到了 IPv6 地址
  1. 以下哪个不是 C++ 里面的循环语句?( )。{{ select(10) }}
  • while
  • do ……while
  • for
  • switch ……case
  1. 若整型变量n 的值为 25,则表达式n&(n+1>>1) 的值为( )。{{ select(11) }}
  • 25
  • 26
  • 9
  • 16
  1. 以下逻辑表达式里,不管 A, B 如何取值,恒为真的是?( )。{{ select(12) }}
  • (¬AB)(AB)AB(¬ A ∨ B ) ∧ ( A ∨ B ) ∧ A ∨ B
  • ((¬AB)(A¬B))¬B((¬ A ∨ B) ∨ (A ∨ ¬ B)) ∧ ¬ B
  • A((¬AB)(A¬B))¬AA ∨ ((¬ A ∨ B) ∨ (A ∨ ¬ B)) ∨ ¬ A
  • ((¬AB)(A¬B))A¬B((¬ A ∨ B) ∨ (A ∨ ¬ B)) ∨ A ∧ ¬ B
  1. 已知一棵完全二叉树共有 2024 个节点,则其叶节点数量为( )个。{{ select(13) }}
  • 1011
  • 1012
  • 1013
  • 1014
  1. 将 1, 2, 3, 4, 5, 6, 7 这 7 个数字排成一排,则保证每一对相邻数字都互质的排法共有( )种。{{ select(14) }}
  • 576
  • 864
  • 720
  • 840
  1. 假设 G 是一张有 n 个点 m 条边的连通图,小明想将其变成一棵 n 个节点的树,必须删去( )条边才能将其变成这样的一棵树?{{ select(15) }}
  • mn1m - n - 1
  • m+n1m + n - 1
  • 1
  • mn+1m - n + 1

二、阅读程序(程序输入不超过数组或字符串定义的范围;每题有且仅有一个正确选项,除特殊说明外,每题 3 分,共计 40 分)

(一)

01  #include<bits/stdc++.h>
02  
03  using namespace std;
04  
05  unsigned int ksm(unsigned int x, unsigned int y)
06  {
07      unsigned int ans=1;
08      while(y)
09      {
10          if(y&1) ans=ans*x;
11          y>>=1;
12          x=x*x;
13      }
14      return ans;
15  }
16  
17  int main()
18  {
19      int x, y;
20      cin >> x >> y;
21      cout << (int)(ksm(x,y)) << '\n';
22  }
  1. 时间复杂度是O(logx)O(\log x) 。( ){{ select(16) }}
  • 正确
  • 错误
  1. 空间复杂度是O(1)O(1) 。( ){{ select(17) }}
  • 正确
  • 错误
  1. (2 分)如果进入ksm 函数,则程序第 10 行代码最少执行 1 次。( ){{ select(18) }}
  • 正确
  • 错误
  1. (2 分)如果x 为 0,则输出恒为 0。( ){{ select(19) }}
  • 正确
  • 错误
  1. 若输入数据为5 3 ,则输出为( )。{{ select(20) }}
  • 1
  • 5
  • 25
  • 125
  1. 若输入数据为2 31 ,则输出为( )。{{ select(21) }}
  • 1073741824
  • 2147483648
  • -1
  • -2147483648

(二)

01  #include<bits/stdc++.h>
02  
03  using namespace std;
04  
05  int mwm(int x)
06  {
07      int ans=0;
08      if(x==1) return 1;
09      for(int i=2;i*i<=x;i++)
10      {
11          if(x%i==0) ; else continue;
12          ans += mwm(i)+mwm(x/i);
13      }
14      return ans+x+1;
15  }
16  
17  int main()
18  {
19      int x;
20      cin>>x;
21      cout<<mwm(x)<<'\n';
22  }
  1. (2 分)存在一组输入,使得程序输出为0 。( ){{ select(22) }}
  • 正确
  • 错误
  1. (2 分)存在一组输入,使得程序输出为1 。( ){{ select(23) }}
  • 正确
  • 错误
  1. (2 分)第 11 行是为了排除i 不是x 因数的情况,只有当ix 因数时才会执行第 12 行。( ){{ select(24) }}
  • 正确
  • 错误
  1. 若输入5 ,则程序输出为( )。{{ select(25) }}
  • 0
  • 1
  • 5
  • 6
  1. 若输入18 ,则程序输出为( )。{{ select(26) }}
  • 53
  • 54
  • 58
  • 59
  1. 在数据范围内,有多少个mwm(x) = x+1 ?( ){{ select(27) }}
  • 7
  • 8
  • 9
  • 10

(三)

01  #include<cstdio>
02  typedef long long LL;
03  const int M = 1e3 + 5;
04  
05  int n;
06  
07  LL b[M], ans;
08  
09  int main() {
10      scanf("%d", &n);
11      if (((1 + n) * n / 2) & 1) puts("0");
12      else {
13          for (int i = 0; i < (1 << (n / 2)); ++i) {
14              int cur = 0;
15              for (int j = 0; (i >> j) > 0; ++j) if ((i >> j) & 1) cur += (j + 1);
16              b[cur]++;
17          }
18          for (int i = 0; i < (1 << (n - n / 2)); ++i) {
19              int cur = 0;
20              for (int j = 0; (i >> j) > 0; ++j) if ((i >> j) & 1) cur += (j + n / 2 + 1);
21              if ((1 + n) * n / 4 >= cur)
22                  ans += b[(1 + n) * n / 4 - cur];
23          }
24          printf("%lld\n", ans / 2);
25      }
26      return 0;
27  }
  1. (2 分)第 11 行是否输出0取决于(1+n)*n/2的奇偶性。( ){{ select(28) }}
  • 正确
  • 错误
  1. (2 分)在程序运行的任意时刻,b数组一定全部是偶数。( ){{ select(29) }}
  • 正确
  • 错误
  1. (2 分)此题目时间复杂度为O(2n)O(2^n) 。( ){{ select(30) }}
  • 正确
  • 错误
  1. 若输入7 ,那么输出结果是( )。{{ select(31) }}
  • 1
  • 2
  • 3
  • 4
  1. 程序输入 5 以内的整数,则输出的和是( )。{{ select(32) }}
  • 0
  • 1
  • 2
  • 3

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

(一)

给定一行句子,每个词之间用空格隔开,要么是全小写英文单词,要么是全大写英文单词,要么是自然数。要求将这些单词倒序输出。而且对于每个单词,如果是小写词,应当转为大写;如果是大写词,应当转为小写;如果是自然数,应该倒转输出。

01  #include<bits/stdc++.h>
02  
03  using namespace std;
04  
05  int n;
06  string s[1007];
07  
08  int main() {
09      while(cin >> s[++n]);
10      ➀;
11      for(int i = n; i >= 1; i--) {
12          for(int j = 0; j < (int)s[i].size(); j++) {
13              if(➁) s[i][j] -= ➂;
14              else if(s[i][j] >= 'A' && s[i][j] <= 'Z') s[i][j] -= ➃;
15          }
16          if(s[i][0] >= '0' && s[i][0] <= '9')
17              for(➄) cout << s[i][j];
18          else cout << s[i];
19          if(i != 1) cout << " ";
20      }
21  }
  1. ➀处应填( )。{{ select(33) }}
  • 不填写
  • n--
  • n++
  • s[n]=0
  1. ➁处应填( )。{{ select(34) }}
  • s[i][j] >= 'z' && s[i][j] <= 'a'
  • s[i][j] <= 'a' && s[i][j] >= 'z'
  • s[i][j] >= 'a' && s[i][j] <= 'z'
  • s[i][j] >= 'z' && s[i][j] >= 'z'
  1. ➂处应填( )。{{ select(35) }}
  • 'a' - 'A'
  • 'a' + 'A'
  • 'A' - 'a'
  • 'A' + 'a'
  1. ➃处应填( )。{{ select(36) }}
  • 'a' - 'A'
  • 'a' + 'A'
  • 'A' - 'a'
  • 'A' + 'a'
  1. ➄处应填( )。{{ select(37) }}
  • int j = (int)s[i].size() - 1; j >= 0; j--
  • int j = (int)s[i].size(); j >= 0; j--
  • j = (int)s[i].size() - 1; j >= 0; j--
  • j = (int)s[i].size(); j >= 0; j--

(二)

在一个餐馆中,有一台空调,每分钟可以选择上调 1 个单位的温度、下调 1 个单位的温度,或者保持不变。初始温度为 m。餐馆有 n 位食客,每位食客在时间点tit_i到达,他们能适应的最低温度是lil_i,最高温度是hih_i。每位食客只会在tit_i时刻逗留。如果温度不在食客的适应范围内,他们就会感到不舒服。请判断空调能否调整温度,使得所有食客都感到舒服。

01  #include <cstdio>
02  #include <algorithm>
03  #define N 105
04  
05  struct node {
06      int t, l, r;
07  } a[N];
08  
09  inline bool cmp(const node &x, const node &y) { ➀ }
10  
11  int main() {
12      int T;
13      scanf("%d", &T);
14      while (T--) {
15          int n, m;
16          scanf("%d%d", &n, &m);
17          for(int i = 1; i <= n; ++i) scanf("%d%d%d", &a[i].t, &a[i].l, &a[i].r);
18          std::sort(➁);
19          int l = m, r = m;
20          int fail = 0;
21          for (int i = 1; i <= n; ++i) {
22              ➂
23              if (l > a[i].r || r < a[i].l) {
24                  ➃;
25                  break;
26              }
27              ➄
28          }
29          if (fail) puts("NO");
30          else puts("YES");
31      }
32      return 0;
33  }
  1. ➀处应填( )。{{ select(38) }}
  • return x.t < y.t;
  • return x.r < y.r;
  • return x.l < y.l;
  • return x < y;
  1. ➁处应填( )。{{ select(39) }}
  • a + 1, a + n, cmp
  • a + 1, a + n + 1, cmp
  • a, a + n + 1
  • a, a + n
  1. ➂处应填( )。{{ select(40) }}
  • l += a[i].t - a[i - 1].t + 1, r -= a[i].t - a[i - 1].t + 1;
  • l -= a[i].t - a[i - 1].t + 1, r += a[i].t - a[i - 1].t + 1;
  • l += a[i].t - a[i - 1].t, r -= a[i].t - a[i - 1].t;
  • l -= a[i].t - a[i - 1].t, r += a[i].t - a[i - 1].t;
  1. ➃处应填( )。{{ select(41) }}
  • l=a[i].l
  • r=a[i].r
  • fail=0
  • fail=1
  1. ➄处应填( )。{{ select(42) }}
  • l = std::max(l, a[i].l); r = std::min(r, a[i].r);
  • l = std::min(l, a[i].l); r = std::max(r, a[i].r);
  • l = std::max(l, l - a[i].l); r = std::min(r, r + a[i].r);
  • l = std::min(l, l + a[i].l); r = std::max(r, r - a[i].r);