2021提高组 CSP-S 初赛模拟试题 (7)
2021提高组 CSP-S 初赛模拟试题 (7)
- 分類:CSP-S 提高组
- 來源:https://lib.nbdp.net/paper/123.html
2021提高组 CSP-S 初赛模拟试题 (7)
一、单选题(每题 2 分,共 30 分) 查看答案
第 1 题 请选出以下的能够被3整除的数( )。
- A. (14)6
- B. (29)12
- C. (4)5
- D. (7^4)9
答案: B. (29)12
第 2 题 运行一个计算机程序,必须将程序装入( )。
- A. CPU
- B. 硬盘
- C. 内存
- D. U盘
答案: C. 内存
第 3 题 入栈顺序为{1,9,4,3,6}的序列的出栈序列不可能为( )。
- A. {6,3,4,9,1}
- B. {1,4,9,3,6}
- C. {9,4,6,3,1}
- D. {3,4,1,6,9}
答案: D. {3,4,1,6,9}
第 4 题 以下IP地址一定指向本机的是()。
- A. 172.0.0.1
- B. 192.168.1.1
- C. 127.0.0.1
- D. 0.0.0.0
答案: C. 127.0.0.1
第 5 题 对于某算法的时间复杂度,若有:T(N)= 4T(N/2)+N^2log^2N, N=1 则该算法的时间复杂度为()。
- A. O(N^3)
- B. O(N^2logN
- C. O(N^2log^2N)
- D. O(N^2log^3N)
答案: D. O(N^2log^3N)
第 6 题 以下排序算法不是基于比较的是( )。
- A. 堆排序
- B. 基数排序
- C. 希尔排序
- D. 插入排序
答案: B. 基数排序
第 7 题 一位女主人宴请5位男士和4位女士,该女主人让所有男士和女士(包含该女主人)围一张圆桌男女交替就坐的方法( )种。
- A. 2880
- B. 3600
- C. 2160
- D. 3000
答案: A. 2880
第 8 题 群是包含一种运算与一个集合的结构。群满足封闭性,即集合中的任意两个元素在该运算的作用下仍属于该集合,据此推断,集合N与以下运算不可能构成群的是( )。
- A. 加法
- B. 减法
- C. 乘法
- D. 幂
答案: B. 减法
第 9 题 一棵树高为4的线段树,全少有( )个节点。
- A. 16
- B. 15
- C. 9
- D. 8
答案: D. 8
第 10 题 以下行为在C++98标准下不是未定义的是( )。
- A. 未声明初始值的int变量的值
- B. 将i++赋值给i
- C. 函数调用中不同参数的求职顺序
- D. 使用变量作为长度声明数组
答案: D. 使用变量作为长度声明数组
第 11 题
左图的先序遍历是( )。
- A. ABDEFC
- B. DBEFAC
- C. DFEBCA
- D. ABCDEF
答案: A. ABDEFC
第 12 题 复杂度分析中常用的O(N)与Q(N)各自代表了( )。
- A. 上界、既是上界也是下界
- B. 上界、下界
- C. 下界、既是上界也是下界
- D. 下界、下界
答案: B. 上界、下界
第 13 题 由四个不同的点构成的简单无向连通图的个数是()。
- A. 32
- B. 35
- C. 38
- D. 41
答案: C. 38
第 14 题 除以113的余数是( )。
- A. 30
- B. 16
- C. 60
- D. 120
答案: A. 30
第 15 题 对于节点数为n的树,以下说法正确的是( )。
- A. 所有节点的入度都为1
- B. 将其重链剖分后,每条重链的节点个数不会超过log2(n)
- C. 出度大于根号n的节点数量不会超过根号n个
- D. 两个节点的lca的 dfs序一定大于两个节点本身的dfs序
答案: C. 出度大于根号n的节点数量不会超过根号n个
二、判断题(每题 2 分,共 20 分)
第 16 题
# include <iostream>
using namespace std;
int fastpow(int a,int b,int p) {
int ans=1;
a=a%p;
for(int i=0; i<=31; i++) {
if(b&(1<<i)) ans=ans*a%p;
a=a*a%p;
}
return ans;
}
int main() {
int a,b,p;
cin>>a>>b>>p;
cout<<fastpow(a, b,p);
return 0;
}
假设输入的a和b和p都是int范围内的正整数,完成下面的判断题和单选题:
判断题
第 16 题 有必要将第7行和第8行的a*a两侧添加括号。( )
- A.正确
- B.错误
答案: 2
第 17 题 交换第7行与第8行,答案不会改变。( )
- A.正确
- B.错误
答案: 2
第 18 题 缩小b的范围一定不会影响代码的正确性。(指在a,p任意给出时答案仍然正确,下同,且最多缩小至10)。( )
- A.正确
- B.错误
答案: A.正确
第 19 题 缩小p的范围一定不会影响代码的正确性。( )
- A.正确
- B.错误
答案: 2
第 20 题 若输入的a为4,b为7,则输出不可能为( )。
- A. 16068
- B. 16086
- C. 16049
- D. 16091
答案: D. 16091
第 21 题 以下说法正确的是( )。
- A. 答案与a必然有相同的奇偶性。
- B. 当输入的a变小时,输出一定变小。
- C. 当a=2时,若b≤30,则答案一定正确。
- D. 此算法的时间复杂度为O(log n)。
答案: C. 当a=2时,若b≤30,则答案一定正确。
第 23 题
#include<iostream>
using namespace std;
int main() {
int n, x; cin >> n>>x;
int a=0, b=0,c=0, na, nb, nc, ans=0;
for(int i=1; i<=n; i++) {
int now;cin>>now;
na = max(a+now, 0);
nb = max(max(a+now*x, b+now*x), 0);
nc = max(max(c+now, b+now), 0);
a= na,b= nb,c=nc;
ans=max(max(ans,a), max(b,c));
}
cout <<ans;
}
假设输入的n、x和now都是绝对值在1000内的整数,完成下面的判断题和单选题:
判断题
第 23 题 一共需要输入n+3个数字。( )
- A.正确
- B.错误
答案: 2
第 24 题 这是一种朴素的未使用任何优化的动态规划算法。( )
- A.正确
- B.错误
答案: 2
第 25 题 a表示前个数的最大连续子序列和。( )
- A.正确
- B.错误
答案: A.正确
第 26 题 在给定的输入范围下,使用int有可能会得到错误答案。( )
- A.正确
- B.错误
答案: 2
第 27 题 以下说法可能是此算法对应的题目的是( )
- A. 给出一个长度为n的序列,可以将一段元素乘以x,求最大连续子序列和。
- B. 给出一个长度为n的序列,可以将不超过x个元素加上x,求最大连续子序列和。
- C. 给出一个长度为n的序列,可以将某些元素加上x,求最大连续子序列和。
- D. 给出一个长度为n的序列,求长度不超过x的最长连续子序列和。
答案: A. 给出一个长度为n的序列,可以将一段元素乘以x,求最大连续子序列和。
第 28 题 以下输入数据得到的结果最大的是( )
- A. {5,3,1,2,0,-2,5}
- B. {3,10,1,-2,1}
- C. {7,1,1,2,-1,1,2,-1,5}
- D. {6,-1,1,2,3,4,5,6}
答案: D. {6,-1,1,2,3,4,5,6}
第 30 题
# include<bits/stdc++.h>
using namespace std;
typedef long long int_t;
int_t dis[1<<18][18];
struct E {
int_t to,w;
E(int_t to, int_t w):to(to),w(w) {}
};
vector<E> G[20];
int_t dfs(int_t rt, int_t vised, int_t n) {
if(rt ==n-1) return 0;
if(dis[vised][rt]) return dis[vised][rt];
dis[vised][rt]=998244353;
for(E e : G[rt]) {
int_t to=e.to, w= e.w;
if((1<<to) & vised) continue;
dis[vised][rt]=max(dis[vised][rt],dfs(to,vised|(1<<to),n)+w);
}
return dis[vised][rt];
}
int main() {
int_t n,m; cin>> n>> m;
while(m--) {
int_t u,v,w;cin>>u>>v>> w;
G[u].push_back(E(v,w));
}
cout<<dfs(0,1,n);
}
假设输入的n是不超过18的正整数,w不会超过10000完成下面的判断题和单选题:
判断题
第 30 题 此代码可以在noip标准F编译。( )
- A.正确
- B.错误
答案: 2
第 31 题 此代码能处理重边与自环。( )
- A.正确
- B.错误
答案: A.正确
第 32 题 此算法可以被dijkstra 替代。( )
- A.正确
- B.错误
答案: 2
第 33 题 以下说法错误的是( )
- A. 第31行,为点u添加了一条边(v,w)
- B. 若去掉第17行,则代码复杂度不变
- C. 若去掉第21行,则程序无法结束
- D. 第19行遍历了以rt为起点的所有边
答案: B. 若去掉第17行,则代码复杂度不变
第 34 题 若以左侧数据为输入数据,则答案为( )
- A. 3
- B. 5
- C. 7
- D. 8
答案: C. 7
第 35 题 此代码的时间复杂度为( )
- A. O(n^2+m)
- B. O(2^n +m)
- C. O(2^n(n+m))
- D. O(n^2logn+m)
答案: C. O(2^n(n+m))
三、编程题(每题 25 分,共 50 分)
第 37 题 (贪心)你用过QQ吗?在QQ群里,管理员可以禁言用户。 在Boboniu的QQ群里,小D每天都开Boboniu的玩笑。 小D会在群里待n天,Boboniu的心情是m。在第i天,如果小D没被禁言,他会开一个严重程度为ai的玩笑;如果开的玩笑严重程度大于m,他就会被Boboniu禁言d天,也就是说,在第i+1,i+2,…,min(i+d,n)天,他都会被禁言。 你可以将序列a重排,求开的所有玩笑的严重程度之和的最大值。 [输入] 第一行是n,d,m,之后一行n个整数ai。 1 ≤d≤n≤=10^5,0≤m≤10^9 ,0≤a≤10^9。 提示:贪心。 试补全程序。
# include <bits/stdc++.h>
using namespace std;
const int MAXN= 1e5 + 5;
int big[MAXN], small[MAXN], sum[MAXN];
int p1=1,p2=1;
int n,m,k,x;
int main() {
cin>> n>> m>> k;
for(int i=1; i<=n; i++) {
cin>>x;
if(x <= k) {
___(1)___;
} else {
big[p2++]=x;
}
}
sort(small+1, small+1+ p1,greater<int>());
sort(big+ 1, big+1 + p2, greater<int>());
for(int i=1; i<=p1; i++) {
___(2)___;
}
int ans= sum[p1], cur = 0;
for(int i=1; i<= p2; i++) {
cur+= ___(3)___;
int days =___(4)___+1;
if(days>n) {
break;
}
int left = min(n-days, p1);
ans=max(ans,___(5)___);
}
cout<< ans<< endl;
return 0;
}
第 37 题 ⑴处应填( )
- A. big[++p1]=x;
- B. big[p1++]=x;
- C. small[++p1]=x;
- D. small[p1++]=x;
答案: D. small[p1++]=x;
第 38 题 ⑵处应填( )
- A. sum[i]=sum[i-1]+small[i];
- B. sum[i+1] = sum[i]+ small[i+1];
- C. sum[i]=sum[i-1] + big[i];
- D. sum[i+1] = sum[i] + big[i];
答案: A. sum[i]=sum[i-1]+small[i];
第 39 题 ⑶处应填( )
- A. small[i]
- B. big[i]
- C. small[i+1]
- D. big[i+1]
答案: B. big[i]
第 40 题 ⑷处应填( )
- A. (i-1)*m
- B. i*(m+1)
- C. i*m
- D. (i-1)*(m+1)
答案: D. (i-1)*(m+1)
第 41 题 ⑸处应填( )
- A. sum[left+1] + cur
- B. sum[left] + cur
- C. sum[left-1]+ cur
- D. sum[left]+cur-1
答案: B. sum[left] + cur
第 43 题 (动态规划)小Q在电子工艺实习课上学习焊接电路板。一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3…进行标号。电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点,都存在且仅存在条通路(通路指连接两个元件的导线序列)。
在电路板上存在一个特殊的元件称为“激发器”。当激发器工作后,产生一个激励电流,通过导线传向每一个它所连接的节点,而中间节点接收到激励电流后,得到信息,件将该激励电流传向与它连接并且尚未接收到激励电流的节点。最终激励电流将到达一些“终止节点”接收激励电流之后不再转发的节点。
激励电流在导线上的传播是需要花费时间的,对于每条边e,激励电流通过它需要的时间为te,而节点接收到激励电流后的转发可以认为是在瞬间完成的。现在这块电路板要求每一个“终止节点”同时得到激励电路–即保持时态同步。 由于当前的构造并不符合时态同步的要求,故需要改变连接线的构造。目前小Q有一个道具,使用一次该道具,可以使得激励电流通过某条连接导线的时间增加一个单位。请同小Q最少使用多少次道具才可使得所有的“终止节点”时态同步? 输入第一行包含一个正整数N( 1≤n≤5*10^5),表示电路板中节点的个数。 输入第二行包含一个整数S,为该电路板的激发器的编号。 接下来N-1行,每行三个整数a,b,t。表示该条导线连接节点a与节点b,且激励电流通过这条导线需要t(1≤t≤10^6)个单位时间。 提示:动态规划,代码中的read函数调用时会从输入读入一个整数, for(X a: B)会枚举类型X的变量集合B中的每个元素。 试补全程序。
#include<bits/stdc++.h>
using namespace std;
typedef long long int_t;
int read() {
int_t x=0,w=1; char ch=0;
while(!isdigit(ch)) {ch = getchar();if(ch =='-')w=-1;}
while(isdigit(ch)) x=___(1)___, ch=getchar();
return x;
}
struct E {
int_t to,w;
E(int_t to0, int_t w0) {to=to0; w=w0;}
};
int_t ans;
vector<E> G[501000];
int_t dfs(int_t rt, int_t fa) {
int_t ret=0,cnt=0;
for(E e: G[rt]) if(e.to != fa) {
int_t res = dfs(e.to, rt)+ e.w;
if (___(4)___) ans+=cnt*(res-ret),___(3)___,cnt++;
else ___(2)___, cnt++;
}
return ret;
}
int main() {
int_t n =read(), s = read();
for(int_t i=1; i<n; i++) {
int_t u = read(), v = read(), w = read();
G[u].emplace_back(v, w);
G[v].emplace_back(u, w);
}
___(5)___
cout << ans;
return 0 ;
}
第 43 题 ⑴处应填( )
- A. x*10+ch-48
- B. x*10+ch-60
- C. x*10+(int)ch
- D. x*10+ch-65
答案: B. x*10+ch-60
第 44 题 ⑵处应填( )
- A. ans += (ret-res)
- B. ans += (res-ret)
- C. ans -= (ret-res)
- D. ans -= (res-ret)
答案: A. ans += (ret-res)
第 45 题 ⑶处应填( )
- A. ++ret
- B. ++res
- C. ret += res
- D. ret = res
答案: D. ret = res
第 46 题 ⑷处应填( )
答案: 1
ret" lay-filter="filter">
答案: 1
=ret" lay-filter="filter">
- C. res < ret
- D. res ≤ ret
答案: 1
第 47 题 ⑸处应填( )
- A. dfs(1,0);
- B. dfs(s,1);
- C. dfs(0,-1);
- D. dfs(s,0);
答案: D. dfs(s,0);