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

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

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

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

1.以下哪个不是个人计算机的硬件组成部分( )。{{ select(1) }}

  • 主板
  • 总线
  • 虚拟内存
  • 硬盘

2.已知一棵二叉树前序遍历为ABCDEFGI,后序遍历为CEDBIGFA,则其中序遍历可能为( )。{{ select(2) }}

  • ABCDEFGI
  • CBEDAFIG
  • CBDEAGFI
  • CBEDAIFG

3.小博手中有8颗子弹,编号为1、2、3、4、5、6、7、8,从编号1开始按序嵌入弹夹中,以下有哪个不是正常打出的子弹的次序( )。{{ select(3) }}

  • 12345678
  • 87654321
  • 32164587
  • 32154876

4.在2424点阵的字库中,汉字“一”与“编“的字模占用字节数分别是( )。(提示:一个点可以点亮或熄灭,有两种状态,因此可以用一个比特位来代替){{ select(4) }}

  • 72、72
  • 32、32
  • 32、72
  • 72、32

5.设循环队列中数组的下标范围是n,其中头尾指针分别是ffrr,则其元素个数是( )。

image-20230511094720640{{ select(5) }}

  • rfr-f
  • rf+1r-f+1
  • (rf)modn+1(r-f)\mod n +1
  • (rf+n)modn(r-f+n)\mod n

6.下面哪个不是操作系统的名字( )。{{ select(6) }}

  • WindowsXP
  • Linux
  • Arch/Info
  • 0S/2

7.用欧几里得算法求最大公约数的方法是( )。

int gcd(int a,int b){
    if(b==0)	return a;
    return gcd(_____);
}

{{ select(7) }}

  • a,a%b
  • b,a%b
  • a%b,a
  • b,a/b

8.以下逻辑表达式的值恒为真的是( )。{{ select(8) }}

  • P(PQ)(PQ)P∨(┐P∧Q)∧(┐P∧Q)
  • Q(PQ)(PQ)Q∨(┐P∧Q)∨(P∧┐Q)
  • PQ(PQ)(PQ)P∨Q∨(P∧┐Q)∨(┐P∧Q)
  • PQ(PQ)(PQ)P∨┐Q∨(P∧┐Q)∨(┐P∧Q)

9.如果树根算第1层,那么一棵n层的二叉树最多有( )个结点。{{ select(9) }}

  • 2n12^n-1
  • 2n2^n
  • 2n+12^n+1
  • 2n+12^{n+1}

10.前缀表达式 +3*2+5 12 的值是( )。{{ select(10) }}

  • 23
  • 25
  • 37
  • 65

11.十进制算术表达式:3×512+7×64+4×8+73\times512+7\times64+4\times8+7的运算结果,用二进制表示为( )。{{ select(11) }}

  • 10111100101
  • 11111100101
  • 11110100101
  • 11111100111

12.若某数z的真值为-0.1010,在计算机中该数表示为1.0110,则该数所用的编码方法是( )。{{ select(12) }}

13.从数字1,2,3,4,5中任取两个不同的数字,构成一个两位数,则这个数字大于40的概率是( ){{ select(13) }}

  • 25\frac{2}{5}
  • 45\frac{4}{5}
  • 15\frac{1}{5}
  • 35\frac{3}{5}

14.用数字0,1,2,3,4,5组成没有重复的五位数,其中比40000大的偶数共有( )。{{ select(14) }}

  • 144个
  • 120个
  • 96个
  • 72个

15.三个盒子中有一个盒子放着珍珠,每个盒子上各写着一句话,但只有一句真话,其余都是谎话。第一个盒子是红色的,上面写着"珍珠在这里";第二个盒子是蓝色的,上面写着"珍珠不在红盒子里";第三个盒子是黄色的,上面写着"珍珠不在这里"请问,珍珠到底在哪个盒子里?( )。{{ select(15) }}

  • 第一个
  • 第二个
  • 第三个
  • 都不在

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

(1) 规定:输入的n为偶数。

1#include <bits/stdc++.h>
2using namespace std;
3const int mm = 1007;
4int map[mm][mm];
5int n;
6int main(){
7	cin >> n;
8	n--;
9	memset(map,0,sizeof(map));
10	for(int i = 0;i<n;i++)
11	{
12		for(int j = 0;j<n;j++)
13		{
14			map[i][j] = (i+j)%n+1;
15		}
16	}
17	for(int i = 0;i<n;i++)
18	{
19		map[i][n] = map[n][i] = map[i][i];
20		map[i][i] = 0;
21	}
22	for(int i = 0;i<=n;i++)
23	{
24		for(int j = 0;j<=n;j++)
25		{
26			cout << map[i][j]<<" ";
27		}
28               cout << endl;
29	}
30	return 0;
31}

判断题

16.若n = 6,map[3][6]的值是4。( ){{ select(16) }}

  • 正确
  • 错误

17.当程序执行完第16行时,此时map数组形成一个矩阵(值不为0的部分),且该矩阵关于从左上到右下的对角线对称。( ){{ select(17) }}

  • 正确
  • 错误

18.输出的值形成一个矩阵,且该矩阵关于从左上到右下的对角线对称。( ){{ select(18) }}

  • 正确
  • 错误

19.值为x的位置有(i1i_{1},j1j_{1}),(i2i_{2},j2j_{2}),...,则任意的两个位置的i和j都不相同.( ){{ select(19) }}

  • 正确
  • 错误

选择题

20.当n = 8时,输出的第4行的值的和是( ).{{ select(20) }}

  • 28
  • 36
  • 8
  • 7

21.输入n时,输出的从右上到左下对角线的值的和是( ). {{ select(21) }}

  • 0
  • n
  • n(n-1)/2
  • (n+1)n/2

(2) 规定输入的n为int范围内的正整数。

1#include <bits/stdc++.h>
2using namespace std;
3int n,m,ans,p[101],e[101];
4int pow1(int x,int w)
5{
6	int res = 1;
7	for(int i = 1;i<=w;i++)
8	{
9		res = res*x;
10	}
11	return res;
12}
13int main(){
14	cin >> n;
15	int i =2;
16	while(n!=1)
17	{
18		if(n%i == 0)
19		{
20			m++;
21			p[m] = i;
22			e[m] = 0;
23			while(n%i ==0)
24			{
25				e[m]++;
26				n = n/i;
27			}
28		}
29		i++;
30	}
31	ans = 1;
32	for(i = 1;i<=m;i++)
33	{
34		ans = ans*(p[i]-1)*pow1(p[i],e[i]-1);
35	}
36	cout << ans << endl;
37	return 0;
38}

判断题

22.输出的值一定比输入的值小。{{ select(22) }}

  • 正确
  • 错误

23.若输入的n的值等于aba^b(a,b均为大于等于2的正整数),则第16行循环执行完毕后,m的值为1,且p[1]的值为a。( ){{ select(23) }}

  • 正确
  • 错误

24.若输入的n为素数,输出的结果有可能是素数。( ){{ select(24) }}

  • 正确
  • 错误

25.若输入的n为素数,程序执行完第30行时,i的值等于一开始输入的n。( ){{ select(25) }}

  • 正确
  • 错误

选择题

26.若输入19800,则输出( )。{{ select(26) }}

  • 3600
  • 4800
  • 19800
  • 158400

27.若输出2400,则输入的n可能为( )。{{ select(27) }}

  • 3200
  • 6400
  • 7200
  • 9000

三、完善程序(28-31题每题4分,32-37题每题3分,共34分)

(1)机场分为国内区和国际区,国内航班飞机只能停靠在国内区,国际航班飞机只能停靠在国际区。一部分廊桥属于国内区,其余的廊桥属于国际区。LL 市新建了一座机场,一共有nn个廊桥。该机场决定,廊桥的使用遵循“先到先得”的原则,即每架飞机抵达后,如果相应的区(国内/国际)还有空闲的廊桥,就停靠在廊桥,否则停靠在远机位(假设远机位的数量充足)。该机场只有一条跑道,因此不存在两架飞机同时抵达的情况。现给定未来一段时间飞机的抵达、离开时刻,请你负责将nn个廊桥分配给国内区和国际区,使停靠廊桥的飞机数量最多。输入的第一行,包含三个正整数n,m1,m2n,m1,m2分别表示廊桥的个数、国内航班飞机的数量、国际航班飞机的数量。接下来m1m1行,是国内航班的信息,第i行包含两个正整数a,ba,b分别表示一架国内航班飞机的抵达、离开时刻。接下来m2m2行,是国际航班的信息,第i行包含两个正整数a,ba, b,分别表示一架国际航班飞机的抵达、离开时刻。每行的多个整数由空格分隔。输出一个正整数,表示能够停靠廊桥的飞机数量的最大值

#include<bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int maxn = 1e6 + 7 ;
inline ll read(){
	ll x = 0 , f = 1 ;
	char c = getchar() ;
	while(c > '9' || c < '0'){
		if(c == '-')
			f = -1 ;
		c = getchar() ;
	}
	while(c >= '0' && c <= '9'){
		x = x * 10 + c - '0' ;
		c = getchar() ;
	}
	return x * f ;
}
ll f[3][maxn] ;
ll u , v , n , m1 , m2 ;
set<pair<ll , ll >> a ;
set<pair<ll , ll >> b ;
void init(set< pair < ll , ll > > &a , ll *t ){
	for(int i = 1 ; i <= n ; i ++){
		vector<pair<ll , ll>> ans ;
		t[i] = t[i - 1]  + t[i] ;
		for(auto it = a.begin() ; it != a.end() ; it = a.upper_bound({____(3)___, 0})){
			++ t[i] ;
			___________(4)___________
 		}
 		for(auto it : ans){
 			a.erase(it) ;	
		}
	}
}
int main(){
	n = read() ;
	m1 = read() ;
	m2 = read() ;
	for(int i = 1 ; i <= m1 ; i ++){
		u = read() ;
		v = read() ;
		___________(1)___________
	}
	for(int i = 1 ; i <= m2 ; i ++){
		u = read(); 
		v = read() ;
		b.insert({u , v}) ;
	}
	init(a , f[1]) ;
	init(b , f[2]) ;	
	long long sum = -0x3f3f3f ;
	for(int i = 0 ; i <= n ; i ++){
		sum = max(sum ,___________(2)___________) ;
	}
	printf("%lld\n" , sum) ;
	return 0 ;
}

28.(1)处应该填写:{{ select(28) }}

  • a.insert(u,v);a.insert({u , v}) ;
  • a.insert(v,u);a.insert({v, u}) ;
  • a.insert(u,i);a.insert({u , i}) ;
  • a.insert(v,i);a.insert({v, i}) ;

29.(2) 处应该填写:{{ select(29) }}

  • f[1][i]+f[1][i]f[1][i] + f[1][i]
  • f[1][ni+1]+f[2][i]f[1][n-i+1] + f[2][i]
  • f[1][i]+f[2][ni]f[1][i] + f[2][n - i]
  • f[2][i]+f[2][i]f[2][i] + f[2][i]

30.(3) 处应该填写:{{ select(30) }}

  • it.end(); it.end();
  • it.first;it.first;
  • (it).begin();(*it).begin();
  • (it).second;(*it).second;

31.(4) 处应该填写:{{ select(31) }}

  • ans.push_back(++t[i]);ans.push\_back(++t[i]) ;
  • ans.push_back(it);ans.push\_back(it);
  • ans.push_back(t[i]);ans.push\_back(t[i]);
  • ans.push_back(it);ans.push\_back(*it);

(2)出租车

题目描述

城市可看作是一个矩形网格,有M个出租车任务,告诉你每个请求的出发时间s,起点坐标(a,b),终点坐标(c,d)。出租车从(a,b)(a,b)(c,d)(c,d)需要的时间为ac+bd|a−c|+|b−d|。若一辆出租车完成某项任务后,能及时赶到另一个任务出发点,则继续完成该任务。注意有些任务可能半夜才能结束。请求出完成所有请求所需要的最少出租车辆数。

输入描述

第一行为一整数N,表示有几组数据,每一组数据第一行有一个整数 M(0<M<500),表示出租车任务。下面M行中,每行为起始时间,格式为hh:mm ( 00:00-23:59),两个整数a,b为起始地址坐标,c,d为目标地址。所有坐标在(0~200)之间。

输出描述

每组数据输出一行,每行只有一个整数,表示最少出租车数。

#include<bits/stdc++.h>
using namespace std;
int T , n;
int vis[501];
int Time[501][501];
struct Point{    
	int s_time , f_time , x1 , y1 , x2 , y2;    
	friend bool operator < (Point a , Point b){        
		return ___________________(1)_________________    
	}
}p[501];
int get_Time(){    
	char time[10];    
	cin >> time;    
	return ___________________(2)______________________ 
}
int get_Time(int x1 , int y1 , int x2 , int y2){ 
	return abs(x1 - x2) + abs(y1 - y2);
}
int main(){    
	ios :: sync_with_stdio(0);    
	cin.tie(0);    
	for(cin >> T ; T ; T --){        
		cin >> n;        
		for(int i = 1;i <= n;i ++){           
			 vis[i] = 0 , p[i].s_time = get_Time();         
			   _________________(3)_________________  
			         p[i].f_time = get_Time(p[i].x1 , p[i].y1 , p[i].x2 , p[i].y2);     
		}        
		sort(p + 1 , p + 1 + n);       
		for(int i = 1;i <= n;i ++)           
			 for(int j = i + 1;j <= n;j ++)                
				Time[i][j] = ________________(4)_______________
		int cnt = 0 , ans = 0;        
		for(int Now_Time = 0 , Now_ID; cnt < n ; ans ++ , Now_Time = 0)     
			for(int i = 1;i <= n;i ++)                
				if(_________(5)_________) 
                   vis[i] = 1 , cnt ++ , Now_Time = __(6)__ , Now_ID = i; //更新当前时间   
		cout << ans << endl;    
	}    
	return 0;
}

32.补全(1)中的代码 {{ select(32) }}

  • a.f_time < b.f_time ? 1 : a.f_time == b. f_time && a.s_time < b.s_time ? 1 : 0;
  • a.f_time < b.f_time;
  • abs(a.x1 - a.x2) + abs(a.y1 - a.y2) < abs(b.x1 - b.x2) + abs(b.y1 - b.y2);
  • a.s_time + a.f_time < b.s_time + b.f_time

33.补全(2)中的代码 {{ select(33) }}

  • ((time[0] - '0') * 10 + time[1] - '0') * 60 + (time[3] - '0') * 10 + time[4] -'0';
  • (time[0] + time[1] - '0') * 60 + (time[3] - '0') * 10 + time[4] -'0';
  • ((time[0] - '0') * 10 + time[1] - '0') * 60 + (time[2] - '0') * 10 + time[3] -'0';
  • ((time[0] - '0') * 10 + time[1] - '0')+ (time[3] - '0') * 10 + time[4] -'0' * 60;

34.补全(3)中的代码 {{ select(34) }}

  • cin >> p[i].s_time >> p[i].x1 >> p[i].y1 >> p[i].x2 >> p[i].y2;
  • cin >> p[i].x1 >> p[i].y1 >> p[i].x2 >> p[i].y2;
  • cin >> p[i].f_time >> p[i].x1 >> p[i].y1 >> p[i].x2 >> p[i].y2;
  • cin >> p[i];

35.补全(4)中的代码 {{ select(35) }}

  • get_Time(p[i].x1 , p[i].y1 , p[j].x2 , p[j].y2);
  • get_Time(p[i].x1 , p[i].y1 , p[i].x2 , p[i].y2);
  • get_Time( );
  • get_Time(p[i].x2 , p[i].y2 , p[j].x1 , p[j].y1);

36.补全(5)中的代码{{ select(36) }}

  • ((Now_Time + Time[Now_ID][i] > p[i].s_time) || Now_Time == 0) && !vis[i]
  • ((Now_Time + Time[Now_ID][i] < p[i].s_time)) && !vis[i]
  • ((Now_Time + Time[Now_ID][i] < p[i].s_time) || Now_Time == 0) && !vis[i]
  • ((Now_Time + Time[Now_ID][i] < p[i].s_time) || Now_Time == 0) && vis[i]

37.补全(6)中的代码{{ select(37) }}

  • p[i].f_time
  • Now_Time + p[i].s_time
  • p[i].s_time + p[i].f_time
  • Now_Time + p[i].f_time