#4533. 1113 - 2024 BCSP-X 上半年活动基础知识测评 (⼩学⾼年级组)
1113 - 2024 BCSP-X 上半年活动基础知识测评 (⼩学⾼年级组)
-
计算机在工作过程中突然停电,( )中的信息不会丢失。
- A. 显存
- B. 寄存器
- C. RAM
- D. ROM
-
中缀表达式 a(b+c)-d 的后缀形式是( )。*
- A. abcd*+-
- B. abc+*d-
- C. abc*+d-
- D. -+*abcd
-
设栈 S 的初始状态为空,元素 a,b,c,d,e 依次入栈,以下出栈序列不可能出现的有( )。
- A. a,b,c,e,d
- B. b,c,a,e,d
- C. a,e,c,b,d
- D. d,c,e,b,a
-
已知 7 个结点的二叉树的先根遍历是 1 2 4 5 6 3 7(数字为结点编号),中根遍历是 4 2 6 5 1 7 3,则该二叉树的后根遍历是( )。
- A. 4 6 5 2 7 3 1
- B. 4 6 5 2 1 3 7
- C. 4 2 3 1 5 4 7
- D. 4 6 5 3 1 7 2
-
在 C++ 中,若变量 x 为 int 类型且已被赋值为 40,则 x&(x-1) 的值为( )。
- A. 79
- B. 47
- C. 32
- D. 0
-
有一个等比数列,共有奇数项,其中第一项和最后一项分别是 2 和 118098,中间一项是 486,请问以下那个数是可能的公比( )。
- A. 2
- B. 3
- C. 4
- D. 5
-
设变量 x 为 float 类型且已赋值,则以下语句能将 x 中的数值四舍五入到小数点后第 2 位的是( )。
- A. x=(x*100+0.5)/100.0;
- B. x=x*100+0.5/100.0;
- C. x=(x/100+0.5)*100.0;
- D. x=(int)(x*100+0.5)/100.0;
-
十六进制下,7 × 7 的运算结果为( )。
- A. 31
- B. 3B
- C. 41
- D. 4B
-
( )是一种选优搜索法,按选优条件向前搜索,以达到目标。
- A. 回溯法
- B. 枚举法
- C. 动态规划
- D. 贪心
-
1TB 代表的字节数量是( )。
- A. 2 的 10 次方
- B. 2 的 20 次方
- C. 2 的 30 次方
- D. 2 的 40 次方
-
字符串中任意一段连续的字符所组成的新字符串称为子串。则字符 AAABBBCCC 共有( )个不同的非空子串。
- A. 3
- B. 12
- C. 36
- D. 45
-
1958 年以前的第一代计算机主要用于科学计算、军事研究。这些计算机以( )为主要逻辑元件。
- A. 晶体管
- B. 电子管
- C. 集成电路
- D. 大规模集成电路
-
链表不具备的特点是( )。
- A. 可用 O(1) 时间随机访问任何一个元素。
- B. 插入、删除操作不需要移动元素。
- C. 存储单元在内存中的地址可以不连续。
- D. 无需事先估计存储空间大小。
-
以下排序算法中,( )属于稳定排序算法。
- A. 堆排序
- B. 选择排序
- C. 冒泡排序
- D. 快速排序
-
完全二叉树的顺序存储方案,是指将完全二叉树的结点从上到下、从左到右依次存放到一个顺序结构的数组中。假定根结点存放在数组的 1 号位置上,则第 k 号结点的父结点如果存在的话,应当存放在数组中的( )号位置。
- A. 2k
- B. 2k+1
- C. ⌊k/2⌋
- D. ⌈k/2⌉
【阅读程序第一题】
假设输入的所有数是不超过 100 的正整数,完成下面的判断题和单选题。
#include<iostream>
using namespace std;
int main(){
int n, a[105], avg=0, ans=0;
cin>>n;
for(int i=1; i<=n; i++){
cin>>a[i];
avg+=a[i];
}
avg/=n;
for(int i=1; i<n; i++)
if(a[i]<avg){
a[i+1]-=(avg-a[i]);
ans+=(avg-a[i]);
} else if(a[i]>avg){
a[i+1]+=(a[i]-avg);
ans+=(a[i]-avg);
}
cout<<ans<<endl;
return 0;
}
-
该程序的算法时间复杂度为 O(n)。(判断题:正确填 A,错误填 B)
- A. 正确
- B. 错误
-
若将第 004 行的代码改为
int n, a[105], avg, ans;(声明变量时不赋值),程序仍可以被正常执行,且对于相同的输入数据,输出结果不变。(判断题:正确填 A,错误填 B)- A. 正确
- B. 错误
-
若将第 004 行的代码改为
int n, a[100], avg = 0, ans= 0;(更改数组 a 的大小),程序仍可以被正常执行,且对于相同的输入数据,输出结果不变。(判断题:正确填 A,错误填 B)- A. 正确
- B. 错误
-
若将第 011 行的 for 循环执行条件改为
i<=n,程序仍可以被正常执行,且对于相同的输入数据,输出结果不变。(判断题:正确填 A,错误填 B)- A. 正确
- B. 错误
-
若将第 016 行的代码改为
else{(去掉 else 之后的条件判断),程序仍可以被正常执行,且对于相同的输入数据,输出结果不变。(判断题:正确填 A,错误填 B)- A. 正确
- B. 错误
-
该程序的输出结果不可能为负数。(判断题:正确填 A,错误填 B)
- A. 正确
- B. 错误
-
若输入数据第一行为 7,第二行为 1 9 2 8 12 2 8,则程序将输出( )。
- A. 2
- B. 16
- C. 21
- D. 26
【阅读程序第二题】
假设输入的所有数是正整数,其中 n 以及数组元素 h[1]...h[n] 均不超过 1,000,000,m 不超过 h[1]...h[n] 之和。
#include<iostream>
using namespace std;
int main(){
int n, h[1000005], L, R;
long long m;
cin>>n>>m;
for(int i=1; i<=n; i++){
cin>>h[i];
if(h[i]>R) R=h[i];
}
while(L<R){
int mid=(L+R+1)/2;
long long tmp=0;
for(int i=1; i<=n; i++)
if(h[i]>mid) tmp+=h[i]-mid;
if(tmp<m) R=mid-1;
else L=mid;
}
cout<<L<<endl;
return 0;
}
-
若将第 11 行的 while 循环执行条件改为
L<=R,程序仍可以被正常执行,且对于相同的输入数据,输出结果不变。(判断题:正确填 A,错误填 B)- A. 正确
- B. 错误
-
若将变量 m 和变量 tmp 的数据类型都改为 int,程序仍可以被正常执行,且对于相同的输入数据,输出结果不变。(判断题:正确填 A,错误填 B)
- A. 正确
- B. 错误
-
程序的输出结果有可能是 0。(判断题:正确填 A,错误填 B)
- A. 正确
- B. 错误
-
若输入数据第一行为 5 20,第二行为 4 42 40 26 46,则程序将输出( )。
- A. 35
- B. 36
- C. 37
- D. 38
-
若输入的 n 为 10,000,程序输出结果的最大可能值是( )。
- A. 9,999
- B. 10,000
- C. 999,999
- D. 1,000,000
【阅读程序第三题】
假设输入的 n 是不超过 5000 的正整数,数组元素 a[1]...a[n] 均是不超过 1 的非负整数。
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=5000+5;
int n, a[MAXN], d[MAXN];
int check(int k){
memset(d, 0, sizeof(d));
int res=0;
for(int i=1, s=0; i<=n; i++){
s+=d[i];
if((a[i]+s)%2==1) continue;
if(i+k>n+1) return 1e9;
d[i]++, s++, res++;
d[i+k]--;
}
return res;
}
int main(){
scanf("%d",&n);
for(int i=1; i<=n; i++) scanf("%d",&a[i]);
int ans=1e9;
for(int k=1; k<=n; k++){
int tmp=check(k);
if(tmp<ans) ans=tmp;
}
printf("%d\n", ans);
return 0;
}
-
若将第 9 行的 for 循环执行条件改为
i+k-1<=n,程序仍可以被正常执行,且对于相同的输入数据,输出结果不变。(判断题:正确填 A,错误填 B)- A. 正确
- B. 错误
-
若将第 15 行的代码改为
s++, res++;(去掉d[i]++),程序仍可以被正常执行,且对于相同的输入数据,输出结果不变。(判断题:正确填 A,错误填 B)- A. 正确
- B. 错误
-
若将第 15 行中的
s++改为s--,程序仍可以被正常执行,且对于相同的输入数据,输出结果不变。(判断题:正确填 A,错误填 B)- A. 正确
- B. 错误
-
程序的输出结果有可能为 0。(判断题:正确填 A,错误填 B)
- A. 正确
- B. 错误
-
程序的输出结果必然小于输入的 n。(判断题:正确填 A,错误填 B)
- A. 正确
- B. 错误
-
该程序的算法时间复杂度为( )。
- A. O(n)
- B. O(n log n)
- C. O(n^2)
- D. O(n^2 log n)
-
若输入数据第一行为 7,第二行为 0 0 1 0 1 0 0,则程序将输出( )。
- A. 3
- B. 4
- C. 5
- D. 6
【完善程序第一题】
给定长度 n 的整数序列 ,以及 q 个询问。每个询问将指定两个整数 l, r,请判断下标在 l 与 r 之间的序列元素(包括 l 与 r)是否互不相同。输入数据保证 , , 。
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=1e5+5;
int n, q, a[MAXN], last[MAXN], tmp[MAXN], mxlast[MAXN];
int main(){
cin>>n>>q;
for(int i=1; i<=n; i++){
cin>>a[i];
___①___;
___②___;
___③___;
if(last[i]>mxlast[i]) mxlast[i]=last[i];
}
while(___④___){
int l, r;
cin>>l>>r;
if(___⑤___) cout<<"No"<<endl; //区间内存在相同元素
else cout<<"YES"<<endl; //互不相同
}
return 0;
}
-
①处应填( )。
- A. last[tmp[i]]=a[i]
- B. last[i]=tmp[a[i]]
- C. tmp[last[i]]=i
- D. tmp[a[i]]=i
-
②处应填( )。
- A. last[tmp[i]]=a[i]
- B. last[i]=tmp[a[i]]
- C. tmp[last[i]]=i
- D. tmp[a[i]]=i
-
③处应填( )。
- A. mxlast[i]=last[i]
- B. mxlast[i]=max(mxlast[i-1], last[i])
- C. mxlast[i]=max(mxlast[i], last[i])
- D. mxlast[i]=last[i-1]
-
④处应填( )。
- A. q--
- B. q++
- C. i<=q
- D. i=l
- B. mxlast[r]>l
- C. last[r]>=l
- D. last[r]>l
【完善程序第二题】
小 H 有一个长度为 n 的序列 。他想要知道这个序列中有多少个不同的子序列。两个子序列不同,当且仅当它们包含的元素个数不同,或者在某个位置上的元素不同。由于答案可能很大,你只需要输出答案对 取模后的结果。 注意:空序列也算作一个子序列。
#include<iostream>
using namespace std;
const int MOD=1e9+7;
const int MAXN=1e5+5;
int n, a[MAXN], last[MAXN], dp[MAXN];
int main(){
cin>>n;
for(int i=1; i<=n; i++) cin>>a[i];
dp[0]=1; // 空序列
for(int i=1; i<=n; i++){
dp[i]=(dp[i-1]*2)%MOD;
if(last[a[i]]!=0){
dp[i]=(dp[i]-___①___+MOD)%MOD;
}
___②___;
}
cout<<___③___<<endl;
return 0;
}
-
①处应填( )。
- A. dp[last[a[i]]]
- B. dp[last[a[i]]-1]
- C. dp[i-1]
- D. dp[last[a[i]]+1]
-
②处应填( )。
- A. last[a[i]]=i
- B. last[i]=a[i]
- C. last[a[i]]=i-1
- D. last[a[i]]=dp[i]
-
③处应填( )。
- A. dp[n]
- B. dp[n-1]
- C. dp[n]+1
- D. dp[n]-1
粤公网安备44195502000178号