#C0003. 2023年图灵编程CSP-J初赛模拟卷3
2023年图灵编程CSP-J初赛模拟卷3
2023年图灵编程CSP-J初赛模拟卷3
一、单项选择题(共15题,每题2分,共计30分)
- 以下哪一种设备属于输出设备()?{{ select(1) }}
- 扫描仪
- 键盘
- 鼠标
- 打印机
- 提出“存储程序”的计算机原理的是()?{{ select(2) }}
- 克劳德·香农
- 戈登·摩尔
- 查尔斯·巴比奇
- 冯·诺依曼
- 一个字长为8位的整数的补码是11111001,则它的原码是( )。{{ select(3) }}
- 00000111
- 01111001
- 11111001
- 10000111
- 在使用高级语言编写程序时,一般提到的“空间复杂度”中的空间是指( )。{{ select(4) }}
- 程序运行时理论上所占的内存空间
- 程序运行时理论上所占的数组空间
- 程序运行时理论上所占的硬盘空间
- 程序源文件理论上所占的硬盘空间
- 下列IP地址中正确的是( )。{{ select(5) }}
- 202.300.12.4
- 192.168.0.3
- 100:128:35:91
- 19.256.0.1
- 已知大写字母A的ASCII编码为65(十进制),则十进制70表示ASCII码中的字符为( )。{{ select(6) }}
- D
- E
- F
- G
- 后缀表达式abc+*d-中,a=1,b=2,c=3,d=4,则该后缀表达式的值为( )。{{ select(7) }}
- 3
- -1
- 5
- 1
- 小朱一个星期要吃3次鱼,但是不能连续两天吃鱼,有多少种不同的吃法?( )。{{ select(8) }}
- 5
- 10
- 15
- 3
- 排序算法最稳定的意思是,关键码相同的记录,排序前后相对位置不发生改变,下列哪种排序算法不是稳定的?( )。{{ select(9) }}
- 插入排序
- 基数排序
- 归并排序
- 堆排序
- 一片容量为8GB的SD卡能存储大约( )张大小为2MB的数码照片。{{ select(10) }}
- 1600
- 2000
- 4000
- 16000
- G是一棵n结点的树,G上有()条边。{{ select(11) }}
- n
- 2n
- n-1
- n+1
- 有一个长为5的A序列:{3.20.4.6.1},现通过进行交换其中相邻两个数字的操作进行排序(头尾数字算相邻),要将A序列排成从小到大的递增序列最少要进行多少次交换操作?(){{ select(12) }}
- 5
- 6
- 7
- 2
- 某算法计算时间表示为递推关系式:T(N)=N+T(N/2),则该算法时间复杂度为().{{ select(13) }}
- 一棵6结点二叉树的中序遍历为 DBAGECF,先序遍历为 ABDCEGF,后序遍历为().{{ select(14) }}
- DGBEFAC
- GBEACFD
- DBGEFCA
- ABCDEFG
- 一家三口人,恰有两个人生日在同一天的概率是()。(假设每年都是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 |
判断题:
- 输入的字符串不能包含空格。() {{ select(16) }}
- 正确
- 错误
- 若输入的字符串只包含小写字母,输出的两个值一定大于等于97。(){{ select(17) }}
- 正确
- 错误
- 若输入的字符串只包含大小写字母,且输出的第二个值为90,则输入的字符串中有且只有一个小写字母。(){{ select(18) }}
- 正确
- 错误
- 若输入的字符串只包含数字2,且多于两个字符,则输出的两个值都是50。(){{ select(19) }}
- 正确
- 错误
选择题:
- 若输入的字符串为"Expo2010 Shanghai China",则输出的结果是()。{{ select(20) }}
- 120 110
- 120 112
- 110 120
- 112 120
- 若输入的字符串有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;
}
判断题:
- 若输入的b数组都是奇数,程序运行到第15行时,b[2]没有发生变化。(){{ select(22) }}
- 正确
- 错误
- 若将第11行和第12行交换,程序的结果可能发生变化。(){{ select(23) }}
- 正确
- 错误
- 当程序运行到第15行时,此时a数组的值等于b数组的值。(){{ select(24) }}
- 正确
- 错误
- 若输入b数组都是偶数,当程序运行到第15行时,a数组中的值也全部为偶数。(){{ select(25) }}
- 正确
- 错误
选择题:
- 该程序能输出的最大结果为()。{{ select(26) }}
- 6561
- 10000
- 104976
- 43046721
- 若输入2 3 5 7,输出的结果为()。{{ select(27) }}
- 210
- 5850
- 3360
- 103680
三、完善程序(第32,33题每题4分,第28、29、30、31、34、35题每题5分,共34分)
(1)、
题目描述
小S最近在玩一个游戏 ,跳格子吃糖果。有个格子,每个格子的糖果都有一个甜度,当然这个糖果有可能是苦的(甜度为负数),小S的跳跃能力不太好,他不能完全掌控他跳跃的距离,准确来说,他最小能跳跃L个格子,最大能跳跃R个格子,若他当前在格子,他能直接跳到中的任意一个格子。现在,小S想跳到对岸去,他想让你帮他计算一下,吃的糖果的甜度的和的最大值是多少。
初始在第0个格子,编号为0的格子糖果甜度为0,只要跳到的格子即为到达对岸。
输入格式
第一行包括三个正整数,
第二行共个整数,第个数字为第个格子上的糖果甜度
输出格式
一个整数,表示最大的糖果甜度之和。
数据范围
$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)应该填写的代码为( ){{ select(28) }}
- memset(f , 0 , sizeof f)
- memset(f , 0x3f , sizeof f)
- memset(f , -0x3f , sizeof f)
- memset(f , -1 , sizeof f)
- (2)应该填写的代码为( ){{ select(29) }}
- (3)应该填写的代码为( ){{ select(30) }}
- head --
- head ++
- tail --
- tail ++
- (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最近在编排图灵的上课队形,初始的时候所有人都独自成一排,每排一个人,一字长蛇阵。
他想实现两种指令:
- 含义为第排作为一个整体,排头在前排尾在后,拼接到第排的尾部。
- 含义为查询第个人和第个人是否在同一排中,若在,中间有多少人。
输入格式
第一行有一个整数 T,表示总共有 T条指令。
指令有两种形式, 和 ()
输出格式
依次对输入的每一条指令进行分析和处理:
- 如果是小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)应该填写的代码为( ){{ select(32) }}
- fa[i] = -1
- fa[i] = 0
- fa[i] = i
- fa[i] = 1
- (2)应该填写的代码为( ){{ select(33) }}
- dis[fx] += dis[fy]
- dis[fy] += dis[fx];
- dis[fy] += sz[fx]
- dis[fx] += sz[fy]
- (3)应该填写的代码为( ){{ select(34) }}
- sz[fy] += sz[fx];
- sz[fx] += sz[fy]
- sz[fx] += dis[fy]
- sz[fy] += dis[fx]
- (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
相关
在以下作业中: