2021入门组 CSP-J 初赛模拟试题 (10)

一、单选题(每题 2 分,共 30 分)
第 1 题 在C++中使用cin和cout应该调用( )库。
第 2 题 n是一个三位数,那n的十位数为( )。
第 3 题 已知大写字母A的ASCII编码为65(十进制),则大写字母J的十进制ASCII编码为( )。
第 4 题 计算机用户可以根据需要安装软件,那么计算机的软件系统一般分为( )。
第 5 题 一片容量为8GB的SD卡能存储大约( )张大小为2MB的数码照片。
第 6 题 一个字节(byte)由( )个二进制位组成。
第 7 题 前缀表达式“+3*2+5 12”的值是( )
第 8 题 一个字长为8位的整数的补码是1111 1001 ,则它的原码是( )。
第 9 题 基于比较的排序时间复杂度的下限是( ),其中n表示待排序的元素个数。
第 10 题 一棵二叉树的前序遍历序列是ABCDEFG.后序遍历序列是CBFEGDA.则根结点的左 子树的结点个数可能是( ) 。
第 11 题 十进制小数13.375对应的二进制数是( )。
第 12 题 根据城名代码规定,表示政府部门网站的城名代码是( )
第 13 题 计算机中的数值信息分为整数和实数(浮点数)。实数之所以能够表示很大或者很小的数,是由于使用了( )。
第 14 题 计划展出10幅不同的画,其中1幅水彩画、4幅油画、5幅国画,排成一行陈列,要求同一品种的画必须连在一起,并且水彩画不放在两端,那么不同的陈列方式有( )种。
第 15 题 定义一种字符申操作,一次可以将其中一个元素移到任意位置。举例说明,对于字符串“BCA”可以将“A”移到“B”之前,变字符串“ABC”,如果要将字符串“DACHEBGIF”变成“ABCDEFGHI”最少需要( )次操作。
二、判断题(每题 2 分,共 20 分)
第 16 题
#include<bits/stdc++.h>
using namespace std;
const int maxn=50;
void getnext(char str[]) {
	int l= strlen(str), i,j,k, temp;
	k=l-2;
	while(k-1>=0&&str[k]>str[k+1])k--;
	i=k+1;
	while(i<1&& str[i]> str[k])i++;
	temp = str[k] ;
	str[k]= str[i-1];
	str[i-1] =temp;
	for(i= l-1; i>k; i--)
		for(j = k+1; j<i; j++)
			if(str[j]>str[j+1]) {
				temp = str[i];
				str[i]= str[j+1];
				str[j + 1] = temp;
			}
	return;
}
int main() {
	char a[maxn];
	int n;
	cin>>a>>n;
	while(n>0) {
		getnext(a);
		n --;
	}
	cout << a << endl;
	return 0;
}
判断题
第 16 题 若输入的字符串a是升序的,那么无论n为多少,第13行的循环都不会执行(执行的条件不满足)。( )
第 17 题 若输入的n等于2,对于第27行,第一次执行完和第二次执行完的字符串最多只有2个字符位置不同。( )
第 18 题 程序执行完第7行时,第k+1个字符到第l-1个字符的值是不严格递减的。( )
第 19 题 程序执行完第12行时,第k+1个字符到第l-1个字符的值是不严格递减的。( )
第 20 题 若输入的字符串有x个字符并且是严格降序的,输入的n等于1,则第16-18行会执行( )次。
第 21 题 若输入的字符串有x个字符并且都相同,输入的n等于1.则第16~18行会执行( )次。
第 23 题
#include<bits/stdc++.h>
using namespace std;
int w[35000],d[35000],dp[35000];
int main()
{
	int n,m;
	scanf("%d%d",&n, &m);
	for(int i=1; i<=n; ++i)
		scanf("%d%d" ,&w[i],&d[i]);
	for(int i=1; i<=n; ++i)
	{
		for(int j=m; j>=w[i]; --j)
			dp[j]=max(dp[j],dp[j-w[i]]+d[i]);
	}
	printf("%d\n" ,dp[m]);
	return 0;
}
判断题
第 23 题 上述代码中,双重循环里循环变量i的枚举顺序改为从w[i]到m,输出结果一定不变。
第 24 题 上述代码中,双重循环中变量i的枚举顺序改为从n到1,输出结果一定不变。( )
第 25 题 若输入数据中,1<= n <= 30000,1< = m<=30000, 1<= w[i]<= 30000,1<= d[i]<= 30000,则所求答案一定没有溢出。( )
第 26 题 若输入数据中,1<= n <= 30000,1<=m<=30000, 1<= w[i]<= 30000, 1< =d[i]<= 10^9,则所求答案一定没有溢出。( )
第 27 题 当输入为: 4 6 1 4 2 6 3 12 2 7 输出为( )。
第 28 题 上述代码的时间复杂度为( )。
三、编程题(每题 25 分,共 50 分)
第 30 题
#include<iostream>
using namespace std;
const int NUM= 5;
int r(int n) {
	int i;
	if(n<=NUM) return n;
	for(int i= 1; i<=NUM; ++i)
		if(r(n-i)<0) return i;
	return -1;
}
int main() {
	int n;
	cin>>n;
	cout<<r(n)<< endl;
	return 0;
}
第 30 题 将第7行“i=1”改为“i=0” ,程序不会出错。( )
第 31 题 程序输出的结果有可能小于-1。( )
第 32 题 若程序两次输入的值分别为n1和n2,且有n1 - n2=1的关系,则对于这两次运行的结果ans1和ans2,有ans1- ans2=1。 ( )
第 33 题 若输入的n大于等于6时,程序一定至少执行一次第9行。( )
第 34 题 (2分)若输入2020,输出的结果为( )。
第 35 题 若已知0<=n<=100,则要使输出的结果为-1.则n的取值有( )种。
第 37 题 (过河问题)在一个月黑风高的夜晚,有一群人在河的右岸,想通过唯一的一根独木桥走到河的左岸。在伸手不见五指的黑夜里,过桥时必须借照灯光来照明,不幸的是,他们只有一盏灯。另外,独木桥上最多能承受两个人同时经过,否则将会坍塌。每个人单独过独木桥都需要一定的时间,不同的人用的时间可能不同。两个人一起过独木桥时,由于只有一盏灯,所以需要的时间是较慢的那个人单独过桥所花费的时间。现在输入N(2<= N <=1000)和这N个人单独过桥需要的时间,请计算总共最少需要多少时间,他们才能全部到达河左岸。 例如,有3个人甲、乙、丙,他们单独过桥的时间分别为1、2、4,则总共最少需要的时间为7。具体方法是:甲、乙一起过桥到河的左岸,甲单独回到河的右岸将灯带回,然后甲、丙在一起过桥到河的左岸,总时间为2+1+4=7。
#include<iostream>
#include<cstring>
using namespace std;
const int SIZE= 100;
const int INFINITY = 10000;
const bool LEFT= true;
const bool RIGHT = false;
const bool LEFT_TO_RIGHT= true;
const bool RIGHT_TO_LEFT= false;
int n,hour[SIZE];
bool pos[SIZE];
int max(int a,int b)
{
	if(a>b)
		return a;
	else
		return b;
}
int go(bool stage)
{
	int i,j, num, tmp,ans;
	if(stage == RIGHT_TO_LEFT)
	{
		num = 0;
		ans = 0;
		for(i= 1; i<=n; ++i)
			if(pos[i]== RIGHT)
			{
				num++;
				if(hour[i]>ans)
					ans=hour[i];
			}
		if(___(1)___)
			return ans;
		ans = INFINITY;
		for(i= 1; i<=n-1; ++i)
			if(pos[i] == RIGHT)
				for(j=i+1; j<=n; ++j)
					if(pos[j] == RIGHT)
					{
						pos[i]= LEFT;
						pos[j]= LEFT;
						tmp=max(hour[i],hour[j])+___(2)___;
						if(tmp < ans)
							ans = tmp;
						pos[i] = RIGHT;
						pos[j] = RIGHT;
					}
		return ans;
	}
	if(stage == LEFT_TO_ RIGHT)
	{
		ans = INFINITY;
		for(i=1; i<=n; ++i)
			if(___(3)___)
			{
				pos[i] = RIGHT;
				tmp=___(4)___;
				if(tmp < ans)
					ans = tmp;
				___(5)___;
			}
		return ans;
	}
	return 0;
}
int main()
{
	int i;
	cin>> n;
	for(i=1; i<=n; ++i)
	{
		cin>> hour[i];
		pos[i] = RIGHT;
	}		
	cout<< go(RIGHT_TO_LEFT)<<endl;
	return 0;
}
第 37 题 ①处应填( )
第 38 题 ②处应填( )
第 39 题 ③处应填( )
第 40 题 ④处应填( )
第 41 题 ⑤处应填( )
第 43 题 (国王放置)在n*m的棋盘上放置k个国王要求k个国王互相不攻击,有多少种不同的放置方法?假设国王放置在第(x,y)格,国王的攻击区城是(x-1,y-1),(x-1,y),(x-1,y+1),(x,y-1),(x,y+1),(x+1,y-1),(x+1,y),(x+1,y+1)。读入三个数n,m,k,输出答案。题目利用回溯法求解。棋盘行标号为0~n-1,列标号为0~m-1。 试补全程序。
#include <cstdio>
#include <cstring>
int n, m, k, ans;
int hash[5][5];
void work(int x, int y, int tot) {
	int i, j;
	if(tot==k) {
		ans++;
		return;
	}
	do {
		while (hash[x][y]) {
			y++;
			if(y==m) {
				x++;
				y=___(1)___;
			}
			if(x == n)
				return;
		}
		for(i=x=x-1; i<=x+1; i++)
			if(i>=&&i<n)
				for(j=y-1; j<=y+1; j++)
					if(j>=0 && j<m)
						___(2)___;
		___(3)___;
		for(i=x-1; i<=x+1; i++)
			if(i>=0 && i< n)
				for(j=y-1; j<=y+1; j++)
					if(j>0 &&j<m)
						hash[i][i]--;
		___(4)___;
		if(y== m) {
			x++;
			y=0;
		}
		if(x==n)
			return;
	} while(1);
}
int main() {
	scanf("%d%d%d", &n, &m, &k);
	ans = 0;
	memset(hash, 0, sizeof(hash));
	___(5)___;
	printf("%d\n", ans);
	return 0;
}
第 43 题 ①处应填( )
第 44 题 ②处应填( )
第 45 题 ③处应填( )
第 46 题 ④处应填( )
第 47 题 ⑤处应填( )