#ACSP1005. cspj-模拟题5
cspj-模拟题5
普及组CSP-J 2024 初赛模拟卷5
单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)
- 十进制数 2024的八进制表示是 ({{ select(1) }})。
- A.3749
- B.3750
- C.3751
- D.3752
- 以下关于计算机协会竞赛的描述正确的是({{ select(2) }})。
- A. NOI 国家集训队每年产生4名选手代表中国参加IOI
- B. CSP-J/CSP-S 是 2018年开始举办的
- C. USACO 晋级白金的选手可以直接参加 NOIP
- D. ACSL 和 NOIP 都是 CCF 旗下的程序设计赛事
- 以下哪个可以用作C++程序中的变量名? ({{ select(3) }})。
- A. public
- B. loops
- C. new
- D. delete
- 以下哪个数据结构不属于线性结构? ({{ select(4) }})。
- A. 栈
- B. 数组
- C. 树
- D. 链表
- 以下哪个属于 STL 函数? ({{ select(5) }})。
- A. main
- B. sort
- C. freepen
- D. scanf
- 小明用递归的方法写了一个斐波那契数列的程序,在这里递归函数经常用到的数据结构是({{ select(6) }})。
- A. 树
- B. 栈
- C. 链表
- D. 队列
- 堆排序程序运行的时间复杂度是 ({{ select(7) }})。
- A. O(logn)
- B. O(n)
- C. O(n²)
- D. O(nlogn)
- 在下列排序算法中,({{ select(8) }})是稳定的排序算法。
- A.归并排序
- B.快速排序
- C.选择排序
- D.拓扑排序
- 一台 32位操作系统的计算机运行C++,下面哪个说法是正确的? ({{ select(9) }})。
- A. C++语言中的一个 int 类型的变量占8字节
- B. C++语言中的一个指针类型的变量占4字节
- C. C++语言中的一个 bool类型的变量占2字节
- D. C++语言中的一个 double类型的变量占4字节
- 设全集I={a,b,c,d,e,f,g,h},集合B∪A={a,b,c,d,e,f},C∩A={c,d,e},~B∩A={a,d},那么集合C∩B∩A为({{ select(10) }})。
- A.{c,e}
- B.{d,e}
- C.{e}
- D.{c,d,e}
- 在不大于19000的正整数中, 与19000互质的正整数有({{ select(11) }}) 个。
- A.9500
- B.9498
- C.7200
- D.9499
- 假设P=true,Q=false,R=true,S=true,逻辑运算表达式P∧Q∨R∧S的值是({{ select(12) }})。
- A. true
- B. false
- C. null
- D. NIL
- 对于二叉树T, 已知其前序遍历序列为1243576, 中序遍历序列为4215736,则其后序遍历序列为({{ select(13) }})。
- A.4257631
- B.4275631
- C.4275361
- D.4723561
- 一个口袋内装有大小相同的7个白球和2个黑球,从口袋中取出3个球,使其中不含黑球,有多少种取法? ({{ select(14) }})。
- A.32
- B.35
- C.24
- D.56
- 在下图中,从顶点({{ select(15) }})出发存在一条路径可以遍历图中的每条边一次,而且仅遍历一次。
- A. B点
- B. A点
- C. E点
- D. C点
阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填✔,错误填✘;除特殊说明外,判断题每题1.5分,选择题每题3分,共计40分)
(1)
#include<bits/stdc++. h>
using namespace std;
int a[100005];
bool judge(int x)
{
int i=2;
if(x==0 | | x==1)
return false;
while( i <= floor(sqrt(x)) && (x%i != 0) )
i++;
if(i > floor(sqrt(x)))
return true;
return false;
}
int inverted(int n)
{
int sum;
sum = 0;
while(n > 0)
{
sum = sum*10 + n%10;
n /= 10;
}
return sum;
}
int main()
{
int m,n,k;
bool flag;
k = 0;
flag = false;
cin >> m >> n;
for(int i=m; i<=n; i++)
if( judge(i) && judge(inverted(i)) )
{
k++;
a[k] = i;
flag = true;
}
if(flag)
{
for(int i=1; i<k; i++)
cout << a[i] << ",";
cout << a[k] << endl;
}
else
cout<< "No" << endl;
return 0;
}
判断题
16.将第6行中的i=2改为i=1,程序的运行结果不会改变。 ({{ select(16) }})
- 正确
- 错误
17.将第9行中的x%i !=0去掉,程序的运行结果不会改变。 ({{ select(17) }})
- 正确
- 错误
18.将第18行删除,程序的运行结果不会改变。 ({{ select(18) }})
- 正确
- 错误
19.将第31行删除,程序的运行结果不会改变。 ({{ select(19) }})
- 正确
- 错误
选择题
- 若输入数据为 1949 2024, 则输出为({{ select(20) }})。
- 1949,1987
- 1949,1979
- 1951,1979
- 1951,1987
21.若输出为NO,则输入可能为({{ select(21) }})。
- 168 180
- 785 792
- 999 1020
- 2024 2050
(2)
#include<bits/stdc++. h>
using namespace std;
int main()
{
string s;
int len, pos,i,j, sum;
sum = 0;
getline(cin,s);
len = s. size();
s[len] = ' ';
for(i=0; i<=len; i++)
{
if(s[i] != ' ')
sum++;
else
{
pos = i;
for(j=1; j<=sum; j++)
cout << s[--pos];
sum = 0;
if(i != len)
cout<<" ";
}
}
cout<<endl;
return 0;
}
判断题
22.将第7行删除,程序的运行结果不会改变。 ({{ select(22) }})
- 正确
- 错误
23.将第9行中的s. size()改为s. length(), 程序的运行结果不会改变。 ({{ select(23) }})
- 正确
- 错误
24.将第10行s[len] = ' '改为s[len] = 32, 程序的运行结果不会改变。 ({{ select(24) }})
- 正确
- 错误
25.将第20行删除,程序的运行结果不会改变。 ({{ select(25) }})
- 正确
- 错误
选择题
- 若输入 CCF CSP, 则输出为({{ select(26) }})。
- FCC PSC
- CCF CSP
- PS C FCC
- PSC CCF
27.将第19行中的--pos改为 pos--, 输入 CCF CSP, 则输出为({{ select(27) }})。
- PS FC
- CF SP
- FC PS
- CC SC
(3)
#include<bits/stdc++. h>
#define N 1000010
using namespace std;
int x, tot, a[N];
void calculate(int n, int step)
{
int ans;
ans = 1;
for(int i=1; i<=step-1; i++)
ans *= a[i];
if(ans > x)
return;
if(ans == x)
{
tot++;
return;
}
for(int i=a[step-1]; i<=x; i++)
if(n%i == 0)
{
n /= i;
a[step] = i;
calculate(n, step+1);
n *= i;
}
}
int main()
{
int n;
cin >> n;
while(n--)
{
tot = 0;
cin >> x;
a[0] = 2;
calculate(x, 1);
cout << tot << endl;
}
return 0;
}
判断题
- 若将第2行替换为const int N=1000010; 程序的运行结果不会改变。 ({{ select(28) }})
- 正确
- 错误
29.若将第8行删除,程序的运行结果不会改变。 ({{ select(29) }})
- 正确
- 错误
30.若将第15行中的 tot++替换为++tot, 程序的运行结果不会改变。 ({{ select(30) }})
- 正确
- 错误
31.将第21行和第22行交换,程序的运行结果不会改变。 ({{ select(31) }})
- 正确
- 错误
选择题
32.本程序中的算法用到了 ({{ select(32) }})的思想。
- 贪心
- 搜索回溯
- 二分
- 动态规划
33.若输入2 24 36, 那么输出结果是 ({{ select(33) }})。
- 7 9
- 7 8
- 8 9
- 8 8
34.(4分) 若输入2 96 2024, 那么输出结果是 ({{ select(34) }})。
- 18 20
- 18 21
- 19 20
- 19 21
三.完善程序(单选题,每小题3分,共计30分)
(1)给定两个正整数l和r,求区间[1,r]内素数的个数。如下代码是一个经典的计算过程,请将程序补充完整。
输入格式:
第1行有两个整数,分别代表询问次数n和给定区间的右端点最大值m。接下来n行,每行两个整数l和r,代表一次查询。
输出格式:
对于每次查询输出一行,若 l,r∈[1,m],则输出区间内素数的个数,否则输出Crossing the line。
输入样例:
2 5
1 3
1 6
输出样例:
2
Crossing the line
c
#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;
}
35.①处应填({{ select(35) }})。
- i <= m
- i * i <= m
- i <= n
- i * i <= n
36.②处应填({{ select(36) }})。
- int j = 1
- int j = 2
- int j = i
- int j = i * i
37.③处应填 ({{ select(37) }})。
- is prime[j] = true
- is prime[i] = true
- is prime[j] = false
- is prime[i] = false
38.④处应填 ({{ select(38) }})。
- sum[i]++
- sum[i] += sum[i - 1]
- sum[i] = sum[i - 1]
- sum[i] = sum[i - 1] + 1
39.⑤处应填 ({{ select(39) }})。
- sum[r+1] - sum[l]
- sum[r+1] - sum[l-1]
- sum[r] - sum[l-1]
- sum[r] - sum[l]
(2) N 位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的 K 位同学排成合唱队形。
合唱队形是指这样的一种队形:设 K 位同学从左到右依次编号为1,2,…,K, 他们的身高分别为 T₁,T₂,…,TK, 则他们的身高满足T₁<T₂<Tₖᵢ<ᵢTK (1<=i<=k)
你的任务是,已知所有 N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入格式:
输入的第1行是一个整数N,表示同学的总数。第2行有N个整数,用空格分隔,第i个整数 Ti是第 i位同学的身高(厘米)。 输出格式:
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
数据范围: 2≤N≤100, 130≤T₁≤230。
输入样例:
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(40) }})。
- f[i] = 1
- f[i] = 0
- g[i] = 1
- g[i] = 0
- ②处应填({{ select(41) }})。
- h[j] <= h[i]
- h[j] < h[i]
- h[j] >= h[i]
- h[j] > h[i]
- ③处应填({{ select(42) }})。
- j >= i
- j >= 0
- j > i
- j > 0
- ④处应填({{ select(43) }})。
- 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(44) }})。
- 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)