#ACSP1007. cspj-模拟题7
cspj-模拟题7
普及组CSP-J2024 初赛模拟卷7
一、单项选择题(共 15题,每题2分,共计30分;每题有且仅有一个正确选项)
- 在标准 ASCII码表中, 字符'4'的 ASCII 码值用二进制表示是({{ select(1) }})。
- 00000100
- 00110100
- 00110101
- 00110011
- 关于树这种数据结构的下述说法,正确的是({{ select(2) }})。
- 一个有m个顶点和m-1 条边的图就是树
- 树中的任意两个顶点之间有且只有一条简单路径
- 树中有的结点可能构成环
- 若树根层次为1,则对应高度为n的二叉树最多有2n个结点
- 以下哪个不是输入设备?({{ select(3) }})。
- 绘图仪
- 触摸屏
- 扫描仪
- 麦克风
- 当a=3, b=2, c=1时, 执行以下程序段后c=({{ select(4) }})。
if(a>b) a=b; if(b>c) b=c; else c=b; c=a--;
- 0
- 1
- 2
- 3
5.学生在大学选修某些课程时需要先上其他的前置课程,所有课程和课程间的先修关系构成一个有向图G,有向边<M,N>表示课程M是课程N的先修课,则要找到某门课程L的全部先修课,下面哪种算法不可行?({{ select(5) }})。
- Dijkstra
- BFS
- DFS
- BFS+DFS
6.下列对语句 freopen("function.in", "r", stdin);的分析中正确的是({{ select(6) }})。
- freopen 是文件名
- function.in是重定向函数名
- r代表重定向为“写”方式
- 语句将 cin重定向到文件 function.in
7.Windows 下可执行文件的扩展名是({{ select(7) }})。
- com
- exe
- cpp
- dll
8.[x]补码=10011000, 其原码为({{ select(8) }})。
- 011001111
- 11101000
- 11100110
- 01100101
9.下面有关布尔类型的函数的说法,正确的是({{ select(9) }})。
- 布尔类型函数只能返回0和1两个值
- 布尔类型函数可以返回负数
- 布尔类型函数必须有参数传递
- 布尔类型函数可以返回 NULL
10.下面有关格雷码的说法,错误的是({{ select(10) }})。
- 在格雷码中,任意两个相邻的代码只有一位二进制数不同
- 格雷码是一种可靠性编码
- 在格雷码中,最大数和最小数只有一位二进制数不同
- 格雷码是一种唯一性编码
11.现在有5个整数-2,-1,0,1,2,. 从中任意挑选两个整数,它们的和为0的概率是多少?({{ select(11) }})。
- 1/6
- 1/4
- 1/5
- 1/10
12.小明走楼梯,每次上台阶能跨1或2 级。下面是走到第N步台阶的C++实现代码。该段代码采用的是({{ select(12) }})算法。
- 递推
- 贪心
- 递归
- 分治
int UpStairs(int N) { if(N==1) return 1; else if(N==2) return 2; else return UpStairs(N-2) + UpStairs(N-1); }
13.某内容中仅会出现A,B,C,D,E,F,G, 对应的出现概率分别为0.40,0.30,0.15,0.05,0.04,0.03, 0.03, 如下图所示。按照哈夫曼编码规则, 假设B的编码为11, 则 D 的编码为({{ select(13) }})。
- 10010
- 10011
- 10111
- 10001
14.某学习小组有5名男生和3名女生,从中选3名男生和1名女生参加3项竞赛活动,每项活动至少有 1人参加,则参赛方法有({{ select(14) }})种。
- 960
- 1080
- 2160
- 540
15.简单无向连通图G有18条边,且每个顶点的度数为2,则图G有({{ select(15) }})个顶点。
- 81
- 17
- 18
- 64
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填✔,错误填×;除特殊说明外,判断题每题1.5分,选择题每题3分,共计40分)
(1)
#include<bits/stdc++. h>
using namespace std;
int a[101000];
int p(int deep){
return pow(2, deep);
}
int main(){
int n, mindeep=1,i=2, deep=2;
scanf("%d %d",&n,δa[1]);
long long maxx = a[1];
for(i=2;i<=n;i++)
scanf("%d",&a[i]);
i=2;
while(i<=n){
long long sum=0;
for(;i<p(deep)&&i<=n;i++)
sum+=a[i];
if(sum > maxx)
maxx = sum, mindeep = deep;
deep++;
}
cout << mindeep;
return 0;
}
判断题
16.将第8行中的i=2改为i,程序的运行结果不会改变。({{ select(16) }})
- 正确
- 错误
17.如果输入都是正整数, 那么将第 10行中的a[1]替换成a[0], 将第13 行中的 i=2替换成 i=1,程序的运行结果不会改变。({{ select(17) }})
- 正确
- 错误
18.将第 15 行中的 long long sum=0;替换成 long long sum;, 程序的运行结果不会改变。({{ select(18) }})
- 正确
- 错误
19.将第18行中的if(sum > maxx)替换成if(sum >= maxx), 程序的运行结果不会改变。({{ select(19) }})
- 正确
- 错误
选择题
20.若输入为 7 1 6 5 4 3 2 1, 则输出为({{ select(20) }})。
- 11
- 2
- 10
- 3
21.若输入为15 9 4 5 3 3 3 2 1 2 1 1 1 1 1 1 1 1 1 1 1, 则输出为({{ select(21) }})。
- 4
- 3
- 2
- 1
(2)
#include <bits/stdc++. h>
using namespace std;
bool judge(int a)
{
while(a!=0)
{
int t = a%10;
if(t==2 || t==4)
return 0;
a = a/10;
}
return 1;
}
int main(void)
{
int sum=0,n;
cin>>n;
for(int i=1;i<n/3+1;i++)
if(judge(i))
for(int j=i+1;j<n-i-j;j++)
if(judge(j) && judge(n-i-j))
{
sum++;
}
cout<<sum;
return 0;
}
判断题
22.将 judge函数和main函数的位置调换一下,程序的运行不受影响。({{ select(22) }})
- 正确
- 错误
23.将第3行中的bool改为 int,程序的运行结果不会改变。({{ select(23) }})
- 正确
- 错误
24.该程序运行的时间复杂度是 O(nlogn)。({{ select(24) }})
- 正确
- 错误
25.将第20行中的j=i+1改为 j=1, 程序的运行结果不会改变。({{ select(25) }})
- 正确
- 错误
选择题
26.若输入 n = 24, 则程序的输出为({{ select(26) }})。
- 15
- 16
- 14
- 13
27.若程序的输出为20,则程序的输入可能为({{ select(27) }})。
- 38
- 41
- 40
- 42
(3)
#include<bits/stdc++. h>
using namespace std;
typedef long long long LL;
int a[100005],b[100005],c[100005];
int small(int n, int a[], int key)
{
int left=1, right=n;
while(left < right)
{
int mid = (left+right+1)/2;
if(a[mid] < key)
left = mid;
else
right = mid - 1;
}
return left;
}
int big(int n, int c[], int key)
{
int left=1, right=n;
while(left < right)
{
int mid = (left+right)/2;
if(c[mid] > key)
right = mid;
else
left = mid + 1;
}
return left;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;++i)
cin>>a[i];
for(int i=1;i<=n;++i)
cin>>b[i];
for(int i=1;i<=n;++i)
cin>>c[i];
sort(a+1,a+n+1);
sort(b+1,b+n+1);
sort(c+1,c+n+1);
LL count = 0;
for(int i=1;i<=n;i++)
{
int key = b[i];
LL wa = small(n,a, key);
LL wc = big(n,c, key);
if(a[wa] < key && c[wc] > key)
count += wa*(n+1-wc);
}
cout<<count<<endl;
return 0;
}
判断题
28.若将第8行中的while(left < right)替换为while(left <= right), 程序的运行结果不会改变。({{ select(28) }})
- 正确
- 错误
29.若将第10行中的(left+right+1)/2替换为 left+right+1>>1, 程序的运行结果不会改变。({{ select(29) }})
- 正确
- 错误
30.若将第23行中的(left+right)/2替换为left+(right-left)/2,程序的运行结果不会改变。({{ select(30) }})
- 正确
- 错误
31.若将第48行中的small(n,a, key)替换为(lower bound(a+1,a+n+1,b[i])-a)-1,程序的运行结果不会改变。({{ select(31) }})
- 正确
- 错误
选择题
32.本程序运行的时间复杂度是({{ select(32) }})。
- O(1)
- O(n)
- O(n²)
- O(nlogn)
33.若输入3 1 1 1 1 2 2 2 3 3, 那么输出结果是({{ select(33) }})。
- 27
- 21
- 18
- 15
34.(4分)若输入3 1 2 3 3 4 5 5 6 7, 那么输出结果是({{ select(34) }})。
- 27
- 21
- 18
- 15
三、完善程序(单选题,每小题3分,共计30分)
(1) 输入一个十进制正整数 ,然后将 转换为二进制数,最后统计二进制数的各位数字,看看一共有多少位为1,然后打印出总数。
输入格式: 第1行输入十进制正整数。
输出格式: 输出一个整数,表示十进制正整数n转换成的二进制数中有多少位为1。
输入样例:
127
输出样例:
7
样例说明: 十进制数127转换为二进制数 111111,二进制位一共有7个1,所以输出7。
#include<bits/stdc++. h>
using namespace std;
int a[33], cnt;
int main()
{
int n, sum,x;
cin>>n;
cnt=0;
①;
while(x>0)
{
a[②]=x%2;
③;
}
sum=0;
for(int i=1;④;i++)
if(a[i]==1)
⑤;
cout<<sum<<endl;
return 0;
}
35.①处应填({{ select(35) }})。
- x=n
- x=1
- x=0
- x=n-1
36.②处应填({{ select(36) }})。
- --cnt
- ++cnt
- cnt--
- cnt
37.③处应填({{ select(37) }})。
- x/=2
- n++
- x++
- n--
38.④处应填({{ select(38) }})。
- i<cnt
- i<cnt/2
- i<=cnt
- i<=cnt/2
39.⑤处应填({{ select(39) }})。
- sum--
- sum=x
- sum=0
- sum++
(2) 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D₁、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D₂、出发点每升汽油的价格P、沿途加油站数N(N可以为零)、加油站 i 离出发点的距离 D₁、每升汽油的价格。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出 No Solution。 输入格式: 第1行, D₁,C,D₂,P,N。接下来有N行。第i+1行, 两个数字, 即加油站i离出发点的距离D₁和每升汽油的价格P₁。 输出格式: 所需的最少费用,计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出 No Solution。 输入样例:
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
输出样例:
26.95
说明/提示:N≤6, 其余数字≤500。
#include<bits/stdc++. h>
using namespace std;
const int MAXN = 100;
int N;
double D[MAXN], P[MAXN], D1, C, per, req;
int main(){
cin>>D1>>C>>per>>P[0]>>N;
D1 /= per;
for(int i=1; i<=N; i++) {
cin>>D[i]>>P[i];
D[i] /= per;
}
D[0] = 0;
①;
P[N+1] = 0;
double cur = 0, ans = 0;
for(int i=0; i<=N; i++) {
int ni = N+1;
for(int j=i+1; j<= N+1; j++) {
if(P[j] <= P[i]) {
ni = j;
break;
}
}
②;
if(req > C)
③;
if(req > cur) {
ans += (req - cur) * P[i];
cur = req;
}
④;
if(cur < 0)
break;
}
if(cur < 0)
cout<<"No Solution"<<endl;
else
⑤;
return 0;
}
40.①处应填({{ select(40) }})。
- D[N] = D1
- D[N+1] = D1
- D[1] = D1
- D[N-1] = D1
41.②处应填({{ select(41) }})。
- req = D[i] - D[i-1]
- req = D[i+1] - D[i]
- req = D[ni] + D[i]
- req = D[ni] - D[i]
42.③处应填({{ select(42) }})。
- req = C
- req -= C
- req += C
- req %= C
43.④处应填({{ select(43) }})。
- cur += D[i+1] - D[i]
- cur -= D[i+1] - D[i]
- cur += D[ni] - D[i]
- cur -= D[ni] - D[i]
44.⑤处应填({{ select(44) }})。
- printf("%.2d\n", ans)
- printf("%.2lf\n", ans)
- cout<<fixed<<setprecision(2)<<ans<<endl
- cout<<fixed<<setprecision(3)<<ans<<endl