#C1216. CSP-J 初赛模拟题5

CSP-J 初赛模拟题5

一、单项选择题

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

【第 1 题】

1.一个 C++ 语言的源程序中,有关主函数的说法正确的是( )。

{{ select(1) }}

  • 可以有多个主函数
  • 必须有一个主函数
  • 必须有主函数和其他函数
  • 可以没有主函数

【第 2 题】

在下面的条件语句中(其中s1和s2代表C++语言的语句),只有一个在功能上与其它三个语句不等价,它是( )。

{{ select(2) }}

  • if(a) s1; else s2;
  • if(a == 0) s2; else s1;
  • if(a != 0) s1; else s2;
  • if(a == 0) s1; else s2;

【第 3 题】

有如下程序段,则以下说法中正确的是( )。

int k = 5;
do{
    k--;
}while(k <= 0);

{{ select(3) }}

  • 循环执行5次
  • 循环体语句一次也不执行
  • 循环是无限循环
  • 循环体语句执行一次

【第 4 题】

桌上放着红桃、黑桃和梅花三种牌,共20张。以下说法中正确的是( )。

(1)桌上至少有一种花色的牌少于6张

(2)桌上至少有一种花色的牌多于6张

(3)桌上任意两种牌的总数将不超过19张

{{ select(4) }}

  • (1)、(2)
  • (1)、(3)
  • (2)、(3)
  • (1)、(2)、(3)

【第 5 题】

小蓝和小青以及他们的爸爸妈妈共计6个人外出游玩,乘坐有6个座位的游览车,游览车每排只有1个座位,每人都要单独坐一个座位。为了安全起见,车的首位两座一定要坐两位爸爸,小蓝和小青一定要前后挨着坐,那么,这6个人的排座方法共有( )种。

{{ select(5) }}

  • 2
  • 24
  • 36
  • 48

【第 6 题】

表达式'6'-'1'的值是( )。

{{ select(6) }}

  • 整数5
  • 字符5
  • 表达式不合法
  • 字符6

【第 7 题】

若二维数组 a 有 n 列,则在 a[i][j]a[i][j] 前元素个数为( )。

{{ select(7) }}

  • i*n+j-1
  • i*n+j
  • j*n+i
  • i*n+j+1

【第 8 题】

以下叙述中正确的是( )。

{{ select(8) }}

  • break语句只能用于switch语句体中。
  • continue语句的作用是:使程序的执行流程跳出包含它的所有循环。
  • break语句只能用在循环体内和switch语句体内。
  • 在循环体内使用break语句和continue语句的作用相同。

【第 9 题】

按照“先进后出"原则组织数据的结构是( )。

{{ select(9) }}

  • 队列
  • 双向链表
  • 二叉树

【第 10 题】

用0、1、2、3、4这5个数字,能组成多少个没有重复数字的不超过5位长度的偶数?( )

{{ select(10) }}

  • 144
  • 147
  • 160
  • 163

【第 11 题】

在数组中,数组名表示( )。

{{ select(11) }}

  • 数组第1个元素的首地址
  • 数组第2个元素的首地址
  • 数组所有元素的首地址
  • 数组最后1个元素的首地址

【第 12 题】

下列叙述中正确的是( )。

{{ select(12) }}

  • 顺序存储结构的存储空间一定是连续的,链式存储结构的存储空间不一定是连续的
  • 顺序存储结构只针对线性结构,链式存储结构只针对非线性结构
  • 顺序存储结构能存储有序表,链式存储结构不能存储有序表
  • 链式存储结构比顺序存储结构节省存储空间

【第 13 题】

下列排序方法中,最坏情况下比较次数最少的是( )。

{{ select(13) }}

  • 冒泡排序
  • 简单选择排序
  • 直接插入排序
  • 堆排序

【第 14 题】

下列表达式正确的是( )。

{{ select(14) }}

  • 9++
  • (x+y)++
  • c+++c+++c++
  • ++(a-b--)

【第 15 题】

针对以下代码,判断下列说法哪个是正确的( )。

const char str1[] = "abc";
const char str2[] = "abc";
const char *p1 = "abc";
const char *p2 = "abc";

{{ select(15) }}

  • str1和str2地址不同,p1和p2地址相同
  • str1和str2地址相同,p1和p2地址相同
  • str1和str2地址不同,p1和p2地址不同
  • str1和str2地址不同,p1和p2地址相同

二、阅读程序

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

阅读程序(一)

1. #include <bits/stdc++.h>
2. using namespace std;
3. const int SIZE = 25;
4. int n, k, a[SIZE];
5. int cnt = 0;
6. long long ans;
7. bool isPrime(int n) {
8.      cnt++;
9.      cout << cnt << endl;
10.     if (n <= 1)
11.         return false;
12.     for (int i = 2; i * i <= n; ++i)
13.         if (0 == n % i)
14.             return false;
15.     return true;
16. }
17. void dfs(int m, int sum, int x) {
18.     if (m == k) {
19.         if (isPrime(sum)) {
20.             ans++;
21.         }
22.         return;
23.     }
24.     for (int i = x; i < n; ++i)
25.         dfs(m + 1, sum + a[i], i + 1);
26.     return;
27. }
28. int main() {
29.     cin >> n >> k;
30.     for (int i = 0; i < n; ++i)
31.         cin >> a[i];
32.     dfs(0, 0, 0);
33.     cout << ans << endl;
34.     return 0;
35. }

假设输入的所有数都为不超过 1000 的正整数,完成下面的判断题和单选题:

判断题

  1. 将第 12 ⾏中的 i*i<=n 改为 i<=sqrt(n),程序的运⾏结果不会改变。 {{ select(16) }}
  • 正确
  • 错误
  1. 将第 25 ⾏中的 sum+a[i] 改为 sum+=a[i],程序的运⾏结果不会改变。 {{ select(17) }}
  • 正确
  • 错误
  1. 若输⼊ k 值⽐ n ⼤,则程序会死循环,⽆输出。 {{ select(18) }}
  • 正确
  • 错误

单选题

  1. 若输⼊ k 的值为 6,且输⼊ n>=k,a 数组的元素均为相等的正整数,则输出为( )。 {{ select(19) }}
  • 0
  • 2
  • 4
  • 8
  1. 若输⼊ 12 8,则 isPrime 被调⽤的次数为( )。 {{ select(20) }}
  • 4
  • 66
  • 132
  • 495

阅读程序(二)

1. #include <cstdio>
2. #include <cstring>
3. using namespace std;
4. char s[101];
5. int n, cnt[26];
6. int main() {
7. 	  scanf("%s", s);
8.	  n = strlen(s);
9.	  for (int i = 0; i < n; i++) {
10.		 if (s[i] >= 'A' && s[i] <= 'Z')
11.			 cnt[s[i]-'A']++;
12.		 if (s[i] >= 'a' && s[i] <= 'z')
13.			 cnt[s[i]-'a']++;
14.		 if (s[i] >= '0' && s[i] <= '9')
15.			 cnt[s[i]-'0']++;
16.	  }
17.	  int p = 0;
18.	  for (int i = 1; i < 26; i++)
19.		 if (cnt[i] > cnt[p])
20.			 p = i;
21.	  printf("%d\n", p);
22.	  return 0;
23. }

假设输入的字符串长度不超过 100,完成下面的判断题和单选题。

判断题

  1. 输入的字符串只能由小写字母或大写字母组成。 {{ select(21) }}
  • 正确
  • 错误
  1. 将第 9 行的 i<n 改成 i<=n,程序运行时可能会发生错误。 {{ select(22) }}
  • 正确
  • 错误
  1. 将第 12 行 s[i] >='a' && s[i] <='z'改成s[i] >='a',程序可能发生运行时错误。 {{ select(23) }}
  • 正确
  • 错误
  1. 若输入的字符串全部由数字字符组成,则输出的整数必然小于 10。 {{ select(24) }}
  • 正确
  • 错误

单选题

  1. 若输入为 ABCDcbaAcDbC,输出为( )。 {{ select(25) }}
  • 0
  • 1
  • 2
  • 3
  1. 若输入为 a2B3233CCDC,输出为( )。 {{ select(26) }}
  • 0
  • 1
  • 2
  • 3

阅读程序(三)

1. #include <iostream>
2. using namespace std;
3. int a[101], n, cnt;
4. int main() {
5.	cin >> n;
6.	for (int i = 1; i <= n; i ++) {
7.		cin >> a[i];
8.		int j = i;
9.		while (j > 1 && a[j] < a[j/2]) {
10.			cnt++;
11.			int t = a[j];
12.			a[j] = a[j/2];
12.			a[j/2] = t;
13.			j /= 2;
14.		}
15.	}
16.	cout << cnt << endl;
17.	return 0;
18. }

假设输入的 n 是正整数,a[i] 都是在 [1,n] 范围内的整数,完成下面的判断题和单选题。

判断题

  1. 循环结束时,a[1] 保存的是输入的 n 个数中的最小值。

    {{ select(27) }}

  • 正确
  • 错误
  1. 循环结束时,a[1]~a[n] 按升序排序 (a[1]≤a[2]≤…≤a[n])。 {{ select(28) }}
  • 正确
  • 错误
  1. 当 n 为 10 时,无论输入的 a[1]~a[n] 值为多少,输出的 cnt 不会大于19。 {{ select(29) }}
  • 正确
  • 错误
  1. 当 n 为 100 时,无论输入的 a[1]~a[n] 值为多少,输出的 cnt 不会大于 450。 {{ select(30) }}
  • 正确
  • 错误

单选题

  1. 当输入的 n 为 5,a[1]~a[5] 依次为 3,5,2,4,1 时,输出的结果为( )。 {{ select(31) }}
  • 1
  • 2
  • 3
  • 4
  1. 当输入的 n 为 5,a[1]~a[5] 依次为 2,3,1,4,5 时,输出的结果为( )。 {{ select(32) }}
  • 1
  • 2
  • 3
  • 4

三、完善程序

(单选题,每小题 3 分,共计 30 分)

完善程序(一)

(区间素数个数)给定两个正整数 l 和 r,求区间 [l,r] 内素数的个数。如下代码是⼀个经典的计算过程,请将程序补充完整。 输⼊格式: 第 1 ⾏有两个整数,分别代表询问次数 n 和给定区间的右端点最⼤值 m。接下来 n ⾏,每⾏两个整数 l 和 r,代表⼀次查询。 输出格式: 对于每次查询输出⼀⾏,若 l,r∈[1,m],则输出区间内素数的个数,否则输出 "Crossing the line"。 输⼊样例:

2 5
1 3
1 6

输出样例:

2
Crossing the line
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 5;
bool is_prime[MAXN];
int sum[MAXN];
void get_sum(int m) {
    memset(is_prime, true, sizeof(is_prime));
    is_prime[0] = false;
    is_prime[1] = false;
    for (int i = 2;①; ++i) {
        if (is_prime[i]) {
            for (②; j <= m; j += i)
                ③
        }
    }
    for (int i = 1; i <= m; ++i) {
        if (is_prime[i])
            ④;
        else
            sum[i] = sum[i - 1];
    }
}
int main() {
    int n, m, l, r;
    cin >> n >> m;
    get_sum(m);
    while (n--) {
        cin >> l >> r;
        if (l >= 1 && r <= m)
            cout << ⑤ << endl;
        else
            cout << "Crossing the line" << endl;
    }
    return 0;
}
  1. ① 处应填( )。 {{ select(33) }}
  • i<=m
  • i*i<=m
  • i<=n
  • i*i<=n
  1. ② 处应填( )。 {{ select(34) }}
  • int j=1
  • int j=2
  • int j=i
  • int j=i*i
  1. ③ 处应填( )。 {{ select(35) }}
  • is_prime[j] = true
  • is_prime[i] = true
  • is_prime[j] = false
  • is_prime[i] = false
  1. ④ 处应填( )。 {{ select(36) }}
  • sum[i]++
  • sum[i]+=sum[i-1]
  • sum[i]=sum[i-1]
  • sum[i]=sum[i-1]+1
  1. ⑤ 处应填( )。 {{ select(37) }}
  • sum[r+1]-sum[l]
  • sum[r+1]-sum[l-1]
  • sum[r]-sum[l-1]
  • sum[r]-sum[l]

完善程序(二)

(合唱队形)NN位同学站成一排,音乐老师要请其中的(NK)(N-K)位同学出列,使得剩下的KK位同学排成合唱队形。

合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,,K1, 2, …, K,他们的身高分别为T1,T2,,TKT_1, T_2, …, T_K,则他们的身高满足T1<T2<<Ti,Ti>Ti+1>>TK(1iK)T_1 < T_2 < … < T_i , T_i > T_{i+1} > … > T_K (1≤i≤K)

你的任务是,已知所有NN位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

输入的第一行是一个整数N2N100N(2 ≤ N ≤ 100),表示同学的总数。第二行有nn个整数,用空格分隔,第ii个整数Ti130Ti230T_i(130 ≤ T_i ≤ 230)是第ii位同学的身高(厘米)。

输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。

样例

8
186 186 150 200 160 130 197 220
4
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2024;
int n, ans = 0;
int h[MAXN], f[MAXN], g[MAXN];
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &h[i]);
    for (int i = 1; i <= n; i++) {
        ①;
        for (int j = 1; j < i; j++)
            if ( ② )
                f[i] = max(f[i], f[j] + 1);
    }
    for (int i = n; i; i--) {
        g[i] = 1;
        for (int j = n; ③; j--)
            if (h[j] < h[i])
                ④;
    }
    for (int i = 1; i <= n; i++)
        ⑤;
    printf("%d\n", n - ans);
    return 0;
}
  1. ① 处应填( )。 {{ select(38) }}
  • f[i] = 1
  • f[i] = 0
  • gf[i] = 1
  • g[i] = 0
  1. ② 处应填( )。 {{ select(39) }}
  • h[j]<=h
  • h[j]<h[i]
  • h[j]>=h[i]
  • h[j]>h[i]
  1. ③ 处应填( )。 {{ select(40) }}
  • j>=i
  • j>=0
  • j>i
  • j>0
  1. ④ 处应填( )。 {{ select(41) }}
  • g[i]=max(f[i],f[j]+1)
  • g[i]=max(f[i],g[j]+1)
  • g[i]=max(g[i],f[j]+1)
  • g[i]=max(g[i],g[j]+1)
  1. ⑤ 处应填( )。 {{ select(42) }}
  • ans=max(ans,f[i]+g[i]-1)
  • ans=max(f[i],g[i]-1)
  • ans=max(ans,f[i]+g[i])
  • ans=max(g[i],f[i]-1)