#C0003. 2023年图灵编程CSP-J初赛模拟卷3

2023年图灵编程CSP-J初赛模拟卷3

2023年图灵编程CSP-J初赛模拟卷3

一、单项选择题(共15题,每题2分,共计30分)

  1. 以下哪一种设备属于输出设备()?{{ select(1) }}
  • 扫描仪
  • 键盘
  • 鼠标
  • 打印机
  1. 提出“存储程序”的计算机原理的是()?{{ select(2) }}
  • 克劳德·香农
  • 戈登·摩尔
  • 查尔斯·巴比奇
  • 冯·诺依曼
  1. 一个字长为8位的整数的补码是11111001,则它的原码是( )。{{ select(3) }}
  • 00000111
  • 01111001
  • 11111001
  • 10000111
  1. 在使用高级语言编写程序时,一般提到的“空间复杂度”中的空间是指( )。{{ select(4) }}
  • 程序运行时理论上所占的内存空间
  • 程序运行时理论上所占的数组空间
  • 程序运行时理论上所占的硬盘空间
  • 程序源文件理论上所占的硬盘空间
  1. 下列IP地址中正确的是( )。{{ select(5) }}
  • 202.300.12.4
  • 192.168.0.3
  • 100:128:35:91
  • 19.256.0.1
  1. 已知大写字母A的ASCII编码为65(十进制),则十进制70表示ASCII码中的字符为( )。{{ select(6) }}
  • D
  • E
  • F
  • G
  1. 后缀表达式abc+*d-中,a=1,b=2,c=3,d=4,则该后缀表达式的值为( )。{{ select(7) }}
  • 3
  • -1
  • 5
  • 1
  1. 小朱一个星期要吃3次鱼,但是不能连续两天吃鱼,有多少种不同的吃法?( )。{{ select(8) }}
  • 5
  • 10
  • 15
  • 3
  1. 排序算法最稳定的意思是,关键码相同的记录,排序前后相对位置不发生改变,下列哪种排序算法不是稳定的?( )。{{ select(9) }}
  • 插入排序
  • 基数排序
  • 归并排序
  • 堆排序
  1. 一片容量为8GB的SD卡能存储大约( )张大小为2MB的数码照片。{{ select(10) }}
  • 1600
  • 2000
  • 4000
  • 16000
  1. G是一棵n结点的树,G上有()条边。{{ select(11) }}
  • n
  • 2n
  • n-1
  • n+1
  1. 有一个长为5的A序列:{3.20.4.6.1},现通过进行交换其中相邻两个数字的操作进行排序(头尾数字算相邻),要将A序列排成从小到大的递增序列最少要进行多少次交换操作?(){{ select(12) }}
  • 5
  • 6
  • 7
  • 2
  1. 某算法计算时间表示为递推关系式:T(N)=N+T(N/2),则该算法时间复杂度为().{{ select(13) }}
  • O(N2)O(N^2)
  • O(NlogN)O(NlogN)
  • O(N)O(N)
  • O(1)O(1)
  1. 一棵6结点二叉树的中序遍历为 DBAGECF,先序遍历为 ABDCEGF,后序遍历为().{{ select(14) }}
  • DGBEFAC
  • GBEACFD
  • DBGEFCA
  • ABCDEFG
  1. 一家三口人,恰有两个人生日在同一天的概率是()。(假设每年都是365天){{ select(15) }}
  • 1/365
  • 365/(364 x 365)
  • (3 × 365)/(365 × 365)
  • 1/12

二、阅读程序(共12题,每题3分,共计36分)

1.

1#include <bits/stdc++.h>
2using namespace std;
3int main(){
4	string s;
5	char m1,m2;
6	int i ;
7	getline(cin,s);
8	m1 = ' ';
9	m2 = ' ';
10	for(i = 0;i<s.length();i++)
11	{
12		if(s[i]>m1)
13		{
14			m2 = m1;
15			m1 = s[i];
16		}
17		else if(s[i]>m2)
18		{
19			m2 = s[i];
20		}
21	}
22	cout << int(m1)<<" "<<int(m2)<<endl;
23	return 0;
24}
字符 空格 '0' 'A' 'a'
ASCII 32 48 65 97

判断题:

  1. 输入的字符串不能包含空格。() {{ select(16) }}
  • 正确
  • 错误
  1. 若输入的字符串只包含小写字母,输出的两个值一定大于等于97。(){{ select(17) }}
  • 正确
  • 错误
  1. 若输入的字符串只包含大小写字母,且输出的第二个值为90,则输入的字符串中有且只有一个小写字母。(){{ select(18) }}
  • 正确
  • 错误
  1. 若输入的字符串只包含数字2,且多于两个字符,则输出的两个值都是50。(){{ select(19) }}
  • 正确
  • 错误

选择题:

  1. 若输入的字符串为"Expo2010 Shanghai China",则输出的结果是()。{{ select(20) }}
  • 120 110
  • 120 112
  • 110 120
  • 112 120
  1. 若输入的字符串有3个字符,且都是数字,并且输出的两个值分别是51和50,则输入一共有()种不同的方案。{{ select(21) }}
  • 8
  • 16
  • 15
  • 64

2.

1 #include <bits/stdc++.h>
2 using namespace std;
3 int main(){
4 int a[4],b[4];
5 int i,j,tmp;
6 for(i = 0;i<4;i++) scanf("%d",&b[i]);
7 for(i = 0;i<4;i++){
8   a[i] = 0;
9   for(j = 0;j<=i;j++)
10  {
11       a[i] += b[j];
12       b[a[i]%4]+=a[j];	
13  }	
14 }
15 tmp = 1;
16 for(i = 0;i<4;i++)
17 {
18       a[i]%=10;
19       b[i]%=10;
20       tmp*=a[i]+b[i];
21 }
22 printf("%d\n",tmp);
23 return 0;
}

判断题:

  1. 若输入的b数组都是奇数,程序运行到第15行时,b[2]没有发生变化。(){{ select(22) }}
  • 正确
  • 错误
  1. 若将第11行和第12行交换,程序的结果可能发生变化。(){{ select(23) }}
  • 正确
  • 错误
  1. 当程序运行到第15行时,此时a数组的值等于b数组的值。(){{ select(24) }}
  • 正确
  • 错误
  1. 若输入b数组都是偶数,当程序运行到第15行时,a数组中的值也全部为偶数。(){{ select(25) }}
  • 正确
  • 错误

选择题:

  1. 该程序能输出的最大结果为()。{{ select(26) }}
  • 6561
  • 10000
  • 104976
  • 43046721
  1. 若输入2 3 5 7,输出的结果为()。{{ select(27) }}
  • 210
  • 5850
  • 3360
  • 103680

三、完善程序(第32,33题每题4分,第28、29、30、31、34、35题每题5分,共34分)

(1)、

题目描述

小S最近在玩一个游戏 ,跳格子吃糖果。有n+1n+1个格子,每个格子的糖果都有一个甜度,当然这个糖果有可能是苦的(甜度为负数),小S的跳跃能力不太好,他不能完全掌控他跳跃的距离,准确来说,他最小能跳跃L个格子,最大能跳跃R个格子,若他当前在xx格子,他能直接跳到[x+L,x+R][x+L,x+R]中的任意一个格子。现在,小S想跳到对岸去,他想让你帮他计算一下,吃的糖果的甜度的和的最大值是多少。

初始在第0个格子,编号为0的格子糖果甜度为0,只要跳到>n>n的格子即为到达对岸。

输入格式

第一行包括三个正整数,n,L,Rn,L,R

第二行共n+1n+1个整数,第ii个数字为第i1i-1个格子上的糖果甜度

输出格式

一个整数,表示最大的糖果甜度之和。

数据范围

$n\le 2 \times 10^5 , -10^3 \le A_i \le 10^3 , 1 \le L \le R \le n$

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+7;
const int mod=998244353;

int a[maxn] , Q[maxn] , f[maxn] , n , L , R;
int main(){
	ios :: sync_with_stdio(false);
	cin.tie(0);
	
	____(1)____;
	cin >> n >> L >> R;
	for(int i = 0 ; i <= n ; i ++) cin >> a[i];
	
	f[0] = a[0];
	int head = 1 , tail = 0 , ans = -0x3f3f3f3f;
	for(int i = L ; i <= n ; i ++){
		f[i] = a[i];
		while(head <= tail && ____(2)____ ) tail --;
		Q[++ tail] = i - L;
		while(head <= tail && i - Q[head] > R) ____(3)____;
		____(4)____;
		if(i + R > n) ans = max(ans , f[i]);
	}
	cout << ans << endl;
	return 0;
}
  1. (1)应该填写的代码为( ){{ select(28) }}
  • memset(f , 0 , sizeof f)
  • memset(f , 0x3f , sizeof f)
  • memset(f , -0x3f , sizeof f)
  • memset(f , -1 , sizeof f)
  1. (2)应该填写的代码为( ){{ select(29) }}
  • f[ Q[tail] ]<=f[iL]f[\ Q[tail]\ ] <= f[i - L]
  • f[ Q[head] ]<=f[iL]f[\ Q[head]\ ] <= f[i - L]
  •  Q[tail] <=f[iL]\ Q[tail]\ <= f[i - L]
  •  Q[head] <=f[iL]\ Q[head]\ <= f[i - L]
  1. (3)应该填写的代码为( ){{ select(30) }}
  • head --
  • head ++
  • tail --
  • tail ++
  1. (4)应该填写的代码为( ){{ select(31) }}
  • f[i] += f[i - 1]
  • f[i] += f[Q[tail]]
  • f[i] += f[Q[head]]
  • f[i] += f[i - L]

(2)、

题目描述

小S最近在编排图灵的上课队形,初始的时候所有人都独自成一排,每排一个人,一字长蛇阵。

他想实现两种指令:

  1. M  i  jM\ \ i\ \ j 含义为第ii排作为一个整体,排头在前排尾在后,拼接到第jj排的尾部。
  2. C  i  jC\ \ i\ \ j 含义为查询第ii个人和第jj个人是否在同一排中,若在,中间有多少人。

输入格式

第一行有一个整数 T1T5×105)(1 \le T \le 5 \times 10^5),表示总共有 T条指令。

指令有两种形式,M  i  jM\ \ i\ \ jC  i  jC\ \ i\ \ j (1i,j300001\leq i,j \leq 30000)

输出格式

依次对输入的每一条指令进行分析和处理:

  • 如果是小S发布的调动指令,则表示座位排列发生了变化,你的程序要注意到这一点,但是不要输出任何信息。
  • 如果是小S发布的询问指令,你的程序要输出一行,仅包含一个整数,表示在同一列上,第 i 个人与第 j个人之间的人数。如果第 i个人与第 j 个人当前不在同一排上,则输出 -1。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 7;

int fa[maxn] , dis[maxn] , sz[maxn] , n , x , y;
char s[5];
int find(int x){
	if(x == fa[x]) return x;
	int ans = find(fa[x]);
	dis[x] += dis[fa[x]];
	return fa[x] = ans;
}
int main(){
	
	ios :: sync_with_stdio(false);
	cin.tie(0);
	
	cin >> n;
	for(int i = 1 ; i <= 30000 ; i ++){
		____(1)____ , sz[i] = 1;
	}
	
	while(n --){
		cin >> s >> x >> y;
		int fx = find(x) , fy = find(y);
		if(s[0] == 'M'){
			fa[fx] = fy;
			____(2)____;
			____(3)____;
			sz[fx] = 0;
		}else{
			cout << (fx == fy ? ____(4)____ : -1) << endl;
		}
	}
	return 0;
}
  1. (1)应该填写的代码为( ){{ select(32) }}
  • fa[i] = -1
  • fa[i] = 0
  • fa[i] = i
  • fa[i] = 1
  1. (2)应该填写的代码为( ){{ select(33) }}
  • dis[fx] += dis[fy]
  • dis[fy] += dis[fx];
  • dis[fy] += sz[fx]
  • dis[fx] += sz[fy]
  1. (3)应该填写的代码为( ){{ select(34) }}
  • sz[fy] += sz[fx];
  • sz[fx] += sz[fy]
  • sz[fx] += dis[fy]
  • sz[fy] += dis[fx]
  1. (4)应该填写的代码为( ){{ select(35) }}
  • dis[x] - dis[y] - 1
  • dis[y] - dis[x] - 1
  • abs(dis[x] + dis[y]) - 1
  • abs(dis[x] - dis[y]) - 1