#YHCSPJ0005. CSP-J模拟卷5

CSP-J模拟卷5

单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)

1. 甲乙两位工人一起在工厂工作。甲的生产速度是每小时 6 个鼠标或 2 个键盘。乙的生产速度是每小时 4 个鼠标或 4 个键盘。在一天 6 小时的工作中,甲乙两人通过合理搭配,最多可以一起生产出( )个键鼠套装。

( )。{{ select(1) }}

  • 21
  • 24
  • 28
  • 27

2. 百度公司是一家于 2000 年创立的互联网公司,其业务范围十分广泛。以下选项中,( )不属于百度的业务范围。

( )。{{ select(2) }}

  • 台式计算机
  • 地图
  • 搜索引擎
  • 移动应用
  1. 假如数列 3,6,12,24...符合固定规律,那么它的下一项最可能是( )。 ( )。 {{ select(3) }}
  • 48
  • 96
  • 72
  • 27
  1. 在上网浏览时,可以注意到有些网址以 http:// 开始,有-些则是 https:// 。在这里,后者比前者多出的字母 s 是( )的缩写。 ( )。{{ select(4) }}
  • Second
  • Secure
  • System
  • Speed
  1. 在一张桌子上放了一定数量的铅笔。甲和乙轮流拿走铅笔,每次可以拿 1 根或者 2 根,拿走最后一根铅笔的人获胜。假如甲先取那么在铅笔总数为( )根时乙将最终获胜。 ( )。 {{ select(5) }}
  • 356
  • 525
  • 974
  • 无法判断
  1. 将四个数字 1,3,5,7 经过四则运算(即只使用加、减、乘、除和括号)后,可能得到的最大结果是( )。 ( )。 {{ select(6) }}
  • 140
  • 180
  • 120
  • 105
  1. 下列不属于计算机人工智能应用领域的是( )。 ( )。{{ select(7) }}
  • 在线订票
  • 医疗诊断
  • 智能机器人
  • 机器翻译
  1. 从本质上讲,计算机病毒是一种( )。 ( )。{{ select(8) }}
  • 细菌
  • 文本
  • 程序
  • 微生物
  1. 下列叙述中正确的是( )。 {{ select(9) }}
  • 所谓算法就是计算方法
  • 程序可以作为算法的一种描述方法
  • 算法设计只需考虑得到计算结果
  • 算法设计可以忽略算法的运算时间
  1. 下列结构中为非线性结构的是( ) ( )。 {{ select(10) }}
  • 向量
  • 二维表
  • 矩阵
  1. 在访问网站时,链接前显示的 htp:// 是一种( )。 ( )。 {{ select(11) }}
  • 数据类型
  • 顶级域名
  • 文件格式
  • 传输协议
  1. 一位农夫想用 20 米的铁栅栏围出一个四边形。无论他怎么尝试,这个四边形是面积最大都不会超过( )。 ( )。 {{ select(12) }}
  • 25 m^2
  • 21 m^2
  • 32 m^2
  • 16 m^2
  1. 一袋水果中有 50 个香蕉,30 个葡萄和 40 个草莓。一个人每次从袋子中随机抽取一个水果。( )次后,他手中肯定至少有 10 个相同种类的水果。 ( )。{{ select(13) }}
  • 12
  • 28
  • 13
  • 30
  1. 一位魔术师要将名为酥糖,布丁和曲奇的三只鸽子藏进 A,B,C,D 四个箱子里。每个箱子都足够大,可以同时放下三只鸽子。那么一共有多少种不同的藏法( )。 ( )。 {{ select(14) }}
  • 24
  • 64
  • 48
  • 120
  1. 两位同学在讨论关于全球变暖的问题。小青认为全球变暖是错误的,因为她冬天早上起床时依旧觉得很冷。小蓝则认为全球变暖是确实存在的,原因是过去几十年中地球的平均气温越来越高了。在两个人的讨论中,( )。 ( )。 {{ select(15) }}
  • 小青提出的是观点;小蓝提出的是事实
  • 小青小蓝提出的都是事实
  • 小青提出的都是事实;小蓝提出的是观点
  • 小青小蓝提出的都是观点

阅读程序(程序输入不超过数组或字符串定义的范围;除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)

#include<iostream>
#include<cstdio>
using namespace std;
int gcd(int a,int b)
{
	while(b!=0)
	{
		int r=a%b;
		a=b;
		b=r;
	}
	return a;
}
int main()
{
	int x0,y0,ans=0;
	cin>>x0>>y0;
	for(int p=x0; p<=y0; p++)
	{
		for(int q=x0; q<=y0; q++)
		{
			int g=gcd(p,q) ;
			int b=p*q/g;
			if (g==x0&&b==y0) ans++;
		}
	}
	cout<<ans<<endl ;
}

判断题

16 int gcd(int a,int b)函数是求 a,b 的最小公倍数。( )。{{ select(16) }}

  • 正确
  • 错误

17 x0 为最大公约数,y0 为最小公倍数。( )

( )。{{ select(17) }}

  • 正确
  • 错误

18 x0 一定小于等于 y0。( )

( )。{{ select(18) }}

  • 正确
  • 错误

19 当 x0,y0 的数据范围在[2, 1000000]时,该程序在极端数据情况下会超时。( )

( )。{{ select(19) }}

  • 正确
  • 错误

20 若输入为 3 60,则输出为( )

( )。{{ select(20) }}

  • 4
  • 6
  • 8
  • 16

21 若输入为 2 120,则输出为( )

( )。{{ select(21) }}

  • 6
  • 8
  • 9
  • 10
#include <iostream>
#include <queue>
#define MAXN 100010
using namespace std;
bool visit[MAXN] ;
int n,k;
int ans[MAXN];
bool judge(int x)
{
	bool flag=true;
	if (visit[x]) flag=false;
	if(x<0) flag=false;
	if (x>100000) flag=false;
	return flag;
}
void bfs(int x)
{
	queue <int>q;
	q.push(x) ;
	while(!q.empty())
	{
		int v=q.front() ;
		q.pop();
		visit[v]= true;
		if (v==k)
		{
			return;
		}
		else
		{
			for (int i=0; i<3; i++)
			{
				int w;
				switch (i)
				{
					case 0:w=v-1;break;
					case 1:w=v+1;break;
					case 2:w=v*2;break;
				}
				if (judge (w))
				{
					visit[w]=true;
					ans[w]=ans[v]+1;
					q.push(w) ;
				}
			}
		}
	}
}
int main()
{
	cin>>n>>k;
	ans[n]=0;
	bfs(n);
	cout<<ans[k] ;
	return 0;
}

判断题

22 代码中使用的队列 queue 可以使用一维数组代替。( )

( )。{{ select(22) }}

  • 正确
  • 错误

23 若 n 的值大于 100000,则一定会出现溢出。( )

( )。{{ select(23) }}

  • 正确
  • 错误

24 该程序中 visit[]数组使用做标记数组使用。( )

( )。{{ select(24) }}

  • 正确
  • 错误

25 若输入的数据为 5 17, 则输出为 6( )。

( )。{{ select(25) }}

  • 正确
  • 错误

26 该程序是利用( )算法模板来完成的。

( )。{{ select(26) }}

  • 深度优先搜索
  • 宽度优先搜索
  • 记忆化搜索
  • 迭代加深搜索

27 该程序时间复杂度是多( )。

( )。{{ select(27) }}

  • O(n)
  • O(n^2)
  • O(nlog(n))
  • O(log(n))
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
	int n,k, ii,i,j;
	int a[1010],b[1010];
	cin>>n>>k>>ii;
	for(i=1; i<=n; ++i)a[i]=i;
	for (i=1; i<=k; ++i){
		for (j=1; j<=n; ++j)
			if(j%2==1)b[j]=a[(j+1)/2] ;
			else b[j]=a[n/2+j/2];
		for (j=1; j<=n; ++j)
			a[j]=b[j];
	}
	cout<<a[ii];
	return 0;
}

28 题目中的数组 a[1010],b[1010]可以定义在主函数外面。( )

( )。{{ select(28) }}

  • 正确
  • 错误

29 该程序的时间复杂度为 0(n^2)。( )

( )。{{ select(29) }}

  • 正确
  • 错误

30 若输入为 6 2 5 则输出为( )。

( )。{{ select(30) }}

  • 4
  • 2
  • 8
  • 1

31. 若输入的 n 为 100,k 为大于 10000000000 的数,程序的运行结果可能是?

( )。{{ select(31) }}

  • 输出 a 中的某个位置的数
  • 运行超时但结果正确
  • 因栈溢出崩溃
  • 输出结果一定错误

32. 当 k 的值足够大时,数组 a 最终会呈现什么状态?

( )。{{ select(32) }}

  • 元素完全随机排列
  • 元素按升序排列
  • 元素按降序排列
  • 进入循环状态(周期性重复)

33. 若将数组 a 的初始值全部设为 0,程序的输出会是什么?

( )。{{ select(33) }}

  • 0
  • ii
  • 取决于 k 的值
  • 未定义行为

完善程序(单选题,每题 3 分,共计 30 分)

1. 密码锁.

乌龟给自己的贵重物品上了密码锁。密码锁上有5个数字拨
盘。每个数字拨盘每次向上拨使数字增加1(9向上拨得到0)
,向下拨使数字减少1(0向下拨得到9)。
拨盘上的数字组成一个5位数。只要拨盘上的数字变为素数,
密码锁就会被解开。素数(又称质数)是只能被1和它自身整除
的大于1的自然数。
因为乌龟动作实在太慢,他希望你帮他计算如何开锁,使得拨
动的总次数最少。
输入:
一个5位数,表示拨盘的初始数字
输出:
一个5位素数,表示开启密码锁使用的素数(拨动次数最少)。
如有多组解,输出满足条件的最大数
样例输入:
01210
样例输出:
01319

#include<bits/stdc++.h>
using namespace std;
int x,ma=1000;
int xx[10],yy[10],ans[10];
int prime(int x)
{
	int i;
	if(x<2)return 0;
	for(i=2; i*i<=x; ++i)
		if(__(1)__) return 0;
	return 1;
}
void check(int y)
{
	int t=0, i, tot=0;
	memset (yy,0, sizeof (yy)) ;
	while(y)	{
		yy[++t]=__(2)__;
		y/=10;
	}
	for(i=1; i<=5; ++i)
		tot+=min(__(3)__,abs(10+xx[i]-yy[i]));
	if (tot<ma)	{
		ma=tot;
		for(i=1; i<=5; ++i) ans[i]=yy[i];
	}
}
int main()
{
	int i,t=0;
	cin>>x;
	while(x)	{
		xx[++t]=x%10;
		__(4)__;
	}
	for(i=99999; i>=0; --i)	{
		if (prime(i) ==0) continue ;
		__(5)__;
	}
	for(i=5; i>=1; --i) cout<<ans[i];
	return 0;
}

选择题

34. ⑴ 处应填( )。 {{ select(34) }}

  • x%i==0
  • x%i==1
  • x%i!=1
  • x%i!=0

35. ⑵ 处应填( )。 {{ select(35) }}

  • y%100
  • y%10
  • y/10
  • y/100

36. ⑶ 处应填( )。{{ select(36) }}

  • abs(yy[i]-xx[i])
  • yy[i]-xx[i]
  • max(yy[i]-xx[i])
  • min(yy[i]-xx[i])

37. ⑷ 处应填( )。{{ select(37) }}

  • x/= 10
  • x%=10
  • x%==10
  • x/=100

38. ⑸ 处应填( )。{{ select(38) }}

  • check(i*i)
  • check(i)
  • Check(i)
  • check(i>>2)

2.字符串替换

小明最近迷上了字符串操作。对每个字符串,小明每次可以执行以下两种操作之一: 1.把字符串中的某个字符改成任意一个其他字符,花费1的代价。 2.交换字符串中的两个字符,花费0的代价。 小明发现,把一个字符串通过一系列的操作,可以转换成任何一个与之等长的字符串。例如,把“hello”变为“world”的一种代价为3的操作序列如下:

  1. hello→wello(替换h为w,代价为1)
  2. wello→wolle(交换e和o,代价为0)
  3. wolle→worle(替换l为r,代价为1)
  4. worle→world(替换e为d,代价为1) 小明发现,无法用少于3次的代价将“hello”变为“world”。 显然,不同的转换方案花费的代价是不同的,请编程帮助小明计算把一个字符串变为另一个字符串的最小代价。 本题中的字符串根据给定的初始数值s按以下规则生成: for i=1,2,... n s←(s345) mod 19997 第一个字符串的第i个字符的ASCII码为(97+(s mod 26)) for i=1,2,... n s←(s345) mod 19997 第二个字符串的第i个字符的ASCII码为(97+(s mod 26)) 输入: 正整数n (字符串长度), s (数据生成器的初始数值)。1≤n≤1000, 1≤s≤19997。 输出: 将第一个字符串转换为第二个字符串的最少代价。 输入 样例输入1 4 35 样例输入2 输出 100 31 样例输出1 2 样例输出2 29 在样例1中,生成的字符串是“lzvv”和“xylv”,将第一个字符串变为第二个的最为2。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
	int i,n,s,minn,ans=0;
	int a[200]= {0},b[200]= {0};
	__(1)__;
	for(i=1; i<=n; ++i)	{
		s=__(2)__
		__(3)__;
	}
	for(i=1; i<=n; ++i)	{
		s= (s*345)%19997 ;
		b['a'+s%26]++;
	}
	for(i=__(4)__; i<='z'; ++i)	{
		minn=__(5)__;
        ans+=a[i]-minn;
	}
	cout<<ans<<endl ;
	return 0;
}

选择题

39. ⑴ 处应填( )。{{ select(39) }}

  • cin>>n>>s
  • cin>>s>>n
  • cin << n<< s
  • cin << s << n

40. ⑵ 处应填( )。{{ select(40) }}

  • (s*345)%26
  • (s*345)%19997
  • (s*345)%1997
  • (s*345)/1997

41. ⑶ 处应填( )。{{ select(41) }}

  • a['a'+s%1997]++
  • a['a'+s%26]++
  • a['a'+s%26]--
  • --a['a'+s%26]

42. ⑷ 处应填( )。{{ select(42) }}

  • 'a'
  • 'b'
  • 'A'
  • 'Z'

43. ⑸ 处应填( )。{{ select(43) }}

  • min(a[i],b[i])
  • max(a[i],b[i])
  • abs(a[i],b[i])
  • (a[i],b[i])