#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 列,则在 前元素个数为( )。
{{ 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 的正整数,完成下面的判断题和单选题:
判断题
- 将第 12 ⾏中的 i*i<=n 改为 i<=sqrt(n),程序的运⾏结果不会改变。 {{ select(16) }}
- 正确
- 错误
- 将第 25 ⾏中的 sum+a[i] 改为 sum+=a[i],程序的运⾏结果不会改变。 {{ select(17) }}
- 正确
- 错误
- 若输⼊ k 值⽐ n ⼤,则程序会死循环,⽆输出。 {{ select(18) }}
- 正确
- 错误
单选题
- 若输⼊ k 的值为 6,且输⼊ n>=k,a 数组的元素均为相等的正整数,则输出为( )。 {{ select(19) }}
- 0
- 2
- 4
- 8
- 若输⼊ 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,完成下面的判断题和单选题。
判断题
- 输入的字符串只能由小写字母或大写字母组成。 {{ select(21) }}
- 正确
- 错误
- 将第 9 行的 i<n 改成 i<=n,程序运行时可能会发生错误。 {{ select(22) }}
- 正确
- 错误
- 将第 12 行 s[i] >='a' && s[i] <='z'改成s[i] >='a',程序可能发生运行时错误。 {{ select(23) }}
- 正确
- 错误
- 若输入的字符串全部由数字字符组成,则输出的整数必然小于 10。 {{ select(24) }}
- 正确
- 错误
单选题
- 若输入为 ABCDcbaAcDbC,输出为( )。 {{ select(25) }}
- 0
- 1
- 2
- 3
- 若输入为 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] 范围内的整数,完成下面的判断题和单选题。
判断题
-
循环结束时,a[1] 保存的是输入的 n 个数中的最小值。
{{ select(27) }}
- 正确
- 错误
- 循环结束时,a[1]~a[n] 按升序排序 (a[1]≤a[2]≤…≤a[n])。 {{ select(28) }}
- 正确
- 错误
- 当 n 为 10 时,无论输入的 a[1]~a[n] 值为多少,输出的 cnt 不会大于19。 {{ select(29) }}
- 正确
- 错误
- 当 n 为 100 时,无论输入的 a[1]~a[n] 值为多少,输出的 cnt 不会大于 450。 {{ select(30) }}
- 正确
- 错误
单选题
- 当输入的 n 为 5,a[1]~a[5] 依次为 3,5,2,4,1 时,输出的结果为( )。 {{ select(31) }}
- 1
- 2
- 3
- 4
- 当输入的 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;
}
- ① 处应填( )。 {{ select(33) }}
- i<=m
- i*i<=m
- i<=n
- i*i<=n
- ② 处应填( )。 {{ select(34) }}
- int j=1
- int j=2
- int j=i
- int j=i*i
- ③ 处应填( )。 {{ select(35) }}
- is_prime[j] = true
- is_prime[i] = true
- is_prime[j] = false
- is_prime[i] = false
- ④ 处应填( )。 {{ select(36) }}
- sum[i]++
- sum[i]+=sum[i-1]
- sum[i]=sum[i-1]
- sum[i]=sum[i-1]+1
- ⑤ 处应填( )。 {{ select(37) }}
- sum[r+1]-sum[l]
- sum[r+1]-sum[l-1]
- sum[r]-sum[l-1]
- sum[r]-sum[l]
完善程序(二)
(合唱队形)位同学站成一排,音乐老师要请其中的位同学出列,使得剩下的位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为,他们的身高分别为,则他们的身高满足。
你的任务是,已知所有位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入的第一行是一个整数,表示同学的总数。第二行有个整数,用空格分隔,第个整数是第位同学的身高(厘米)。
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
样例
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;
}
- ① 处应填( )。 {{ select(38) }}
- f[i] = 1
- f[i] = 0
- gf[i] = 1
- g[i] = 0
- ② 处应填( )。 {{ select(39) }}
- h[j]<=h
- h[j]<h[i]
- h[j]>=h[i]
- h[j]>h[i]
- ③ 处应填( )。 {{ select(40) }}
- j>=i
- j>=0
- j>i
- j>0
- ④ 处应填( )。 {{ 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)
- ⑤ 处应填( )。 {{ 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)