2021提高组 CSP-S 初赛模拟试题 (7)

一、单选题(每题 2 分,共 30 分)
第 1 题 请选出以卜的能够被3整除的数( )。
第 2 题 运行一个计算机程序,必须将程序装入( )。
第 3 题 入栈顺序为{1,9,4,3,6}的序列的出栈序列不可能为( )。
第 4 题 以下IP地址一定指向本机的是()。
第 5 题 对于某算法的时间复杂度,若有:T(N)= 4T(N/2)+N^2log^2N, N=1 则该算法的时间复杂度为()。
第 6 题 以下排序算法不是基于比较的是( )。
第 7 题 一位女主人宴请5位男士和4位女士,该女主人让所有男士和女士(包含该女主人)围一张圆桌男女交替就坐的方法( )种。
第 8 题 群是包含一种运算与一个集合的结构。群满足封闭性,即集合中的任意两个元素在该运算的作用下仍属于该集合,据此推断,集合N与以下运算不可能构成群的是( )。
第 9 题 一棵树高为4的线段树,全少有( )个节点。
第 10 题 以下行为在C++98标准下不是未定义的是( )。
第 11 题
左图的先序遍历是( )。
第 12 题 复杂度分析中常用的O(N)与Q(N)各自代表了( )。
第 13 题 由四个不同的点构成的简单无向连通图的个数是()。
第 14 题 $4^{116}$除以113的余数是( )。
第 15 题 对于节点数为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两侧添加括号。( )
第 17 题 交换第7行与第8行,答案不会改变。( )
第 18 题 缩小b的范围一定不会影响代码的正确性。(指在a,p任意给出时答案仍然正确,下同,且最多缩小至10)。( )
第 19 题 缩小p的范围一定不会影响代码的正确性。( )
第 20 题 若输入的a为4,b为7,则输出不可能为( )。
第 21 题 以下说法正确的是( )。
第 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个数字。( )
第 24 题 这是一种朴素的未使用任何优化的动态规划算法。( )
第 25 题 a表示前个数的最大连续子序列和。( )
第 26 题 在给定的输入范围下,使用int有可能会得到错误答案。( )
第 27 题 以下说法可能是此算法对应的题目的是( )
第 28 题 以下输入数据得到的结果最大的是( )
第 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编译。( )
第 31 题 此代码能处理重边与自环。( )
第 32 题 此算法可以被dijkstra 替代。( )
第 33 题 以下说法错误的是( )
第 34 题 若以左侧数据为输入数据,则答案为( )
第 35 题 此代码的时间复杂度为( )
三、编程题(每题 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 题 ⑴处应填( )
第 38 题 ⑵处应填( )
第 39 题 ⑶处应填( )
第 40 题 ⑷处应填( )
第 41 题 ⑸处应填( )
第 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 题 ⑴处应填( )
第 44 题 ⑵处应填( )
第 45 题 ⑶处应填( )
第 46 题 ⑷处应填( )
第 47 题 ⑸处应填( )