#4447. 普及组 CSP-J 第2套初赛模拟试题
普及组 CSP-J 第2套初赛模拟试题
一.单项选择题
共15题,每题2分,共30分;每题有且仅有一个正确选项。
- 以下不是属于国家顶级域名的是( )。 {{ select(1) }}
- .au
- .cn
- .com
- .jp
- 2个10进制数1111和1010的异或运算结果的10进制表示是( )。 {{ select(2) }}
- 101
- 3
- 1957
- 5
- 8位二进制数中去掉符号位,最大能表示多少字符( )。
{{ select(3) }}
- 127
- 128
- 255
- 256
- 在写递归函数时,哪些定义一般不写在递归函数中?( )
{{ select(4) }}
- int
- float
- double
- 数组
- 一棵完全二叉树,共有1234个节点,其叶子结点的个数为( )。
{{ select(5) }}
- 615
- 616
- 617
- 210
- 某公司派赵钱孙李周五人出国学习,选派条件是:
a.若赵去,钱也去;
b.李、周两人必有一人去;
c.若周去,则赵、钱也同去;
d.孙、李二人同去或同不去;
如何选他们出国?( )
{{ select(6) }}
- 孙赵周去
- 赵钱周去
- 李周孙去
- 钱孙去
- 已知一棵二叉树前序遍历为ABCDEFGI,后序遍历为CEDBIGFA,则其中序遍历可能为( )。 {{ select(7) }}
- ABCDEFGI
- CBEDAFIG
- CBDEAGFI
- CBEDAIFG
- 8颗子弹,编号为1,2,3,4,5,6,7,8,从编号1开始按序嵌入弹夹,以下不是正常的打出子弹的次序的是( )。
{{ select(8) }}
- 12345678
- 87654321
- 32154876
- 32164587
- 已知循环队列空间为30,队头位置编号为12,队尾元素下一个空位置编号为5,则队伍中元素个数为( )。
{{ select(9) }}
- 22
- 23
- 7
- 8
-
甲箱中有200个螺杆,其中有160个A型螺杆;乙箱中有240个螺母,其中有180个A 型的。现从甲乙两箱中各任取一个,则能配成A型螺栓的概率为多少?( )
{{ select(10) }}
- 1/20
- 19/20
- 3/5
- 15/16
- 今年信息学进复赛的同学有6人,老师将他们排成一圈分发奖品,一共有( )种排法。 {{ select(11) }}
- 60
- 120
- 180
- 240
- 设二维数组A的行下标为0至5,列下标为1至5,F的每个数据元素均占2个字节。在按行存贮的情况下,已知数据元素A[3][3]的第一个字节是2019,则A[4][4]的第一个字节的地址为( )。 {{ select(12) }}
- 2029
- 2025
- 2027
- 2031
- 在下图中,有( )个顶点出发存在一条路径可以遍历图中的每条边,而且仅遍历一次。

{{ select(13) }}
- 6
- 2
- 3
- 4
- 有A,B,C,D,E,F六个绝顶聪明又势均力敌的盗墓贼,他们都排着队,他们每个人都想独吞财宝,最前面的A如果拿了财宝,那么体力下降,则其后面的B会杀掉A,拿了财宝,当然B拿了财宝,体力也会下降,一样会被C杀掉,如果B不拿财宝,则C无法杀B,若每个人杀人必拿财宝,且优先保命,请问A、C、E的最终想法是( )。 {{ select(14) }}
- A不拿 C不拿 E拿
- A拿 C拿 E不拿
- A不拿 C不拿 E不拿
- A不拿 C拿 E拿
- 以下不属于应用层的是( )。 {{ select(15) }}
- HTTP
- FTP
- TELNET
- UDP
二、阅读程序
程序输入不超过数组或字符串定义的范围;除特殊说明外,判断题1.5分,选择题4分,共计40分
(1)
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
char s1[100];
cin>>s;
len=s. size();
memset(s1,0, sizeof(s1));
for(int i=0;i<len;i++)
{
if(i%2==0)
if ( ( s[i]> ='A ' && s[i] < 'Z') | | ( s[i]>=' a '&& s[i]<'z'))
{
s1[j]=s[i]+1 ;
++j;
}
}
cout<<s1<<endl;
return 0;
}
- 输出的字符串只能是字母组成。( ) {{ select(16) }}
- 正确
- 错误
- 若将12行的“<”改为“<=”,则输出结果有可能包含数字。( ) {{ select(17) }}
- 正确
- 错误
- 将第9行删除,程序运行结果不会改变。( ) {{ select(18) }}
- 正确
- 错误
- 若将11行删除,则输出字符的长度和输入字符的长度一致。( ) {{ select(19) }}
- 正确
- 错误
- 若输入的字符串长度为10,则输出的字符串长度最长可能为( )。 {{ select(20) }}
- 4
- 5
- 6
- 10
- (4分)若输入的字符串都是字母,则输出中可能出现( )。 {{ select(21) }}
- A
- Z
- a
- 以上都不对
(2)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[1001],i,j,t,n;
for( i=0;i< =1000;i++)
a[i] =0 ;
scanf("%d",&n);
for( i=1 ;i< =n;i ++)
{
scanf("%d",&t);
a[t] ++ ;
}
for( i=1000;i> =0;i- - )
for( j=1 ;j<=a[i];j++)
printf( "%d " ,i);
return 0;
}
- 输入10个数字,输出结果是从小到大。( ) {{ select(22) }}
- 正确
- 错误
- 若输入的数字中有两个1,则输出时出来第一个1是第一个输入的。( ) {{ select(23) }}
- 正确
- 错误
- 若将第13行的“<=”改为“<”,且输入数据为10 2 12 33 34 1 2 87 22 9 0,则输出2。( ) {{ select(24) }}
- 正确
- 错误
- 若将第12行改为 for(i=0;i<=1000;i++),则程序运行结果不变。( ) {{ select(25) }}
- 正确
- 错误
- 若将第12行改为for (i=1000;i>1;i--);第13行改为 for(j=a[i];j>1;j--),输入数据为5 2 12 33 34 44,则运行结果( )。 {{ select(26) }}
- 不变
- 输出2 12 33 34 44
- 无输出
- 输出44 34 33 12 2
- 若将第10行改为++a[t]或a[t++],则输入5 1 2 3 4 5,输出结果为( )。 {{ select(27) }}
- 1 2 3 4 5或5 4 3 2 1
- 1 2 3 4 5或无输出
- 5 4 3 2 1或5 4 3 2 1
- 5 4 3 2 1或无输出
(3)
#include<bits/stdc++.h>
using namespace std;
const int maxn=500000,INF=0x3f3f3f3f;
int L[maxn/2+2],R[maxn/2+2];
void unknown(int a[], int n, int left, int mid, int right)
{
int n1=mid-left,n2=right-mid;
for(int i=0;i<n1;i++)
L[i]=a[left+i];
for(int i=0;i<n2;i++)
R[i]=a[mid+i];
L[n1]=R[n2]=INF;
int i=0,j=0;
for(int k=left;k<right;k++)
{
if( L[i]< = R[j])
a[k]= L[i+ + ] ;
else
a[k] =R[j+ + ] ;
}
}
void unknownsort(int a[], int n, int left, int right)
{
if(left+1<right)
{
int mid=(left+right)/2;
unknownsort(a,n, left, mid);
unknownsort(a,n, mid, right);
unknown(a,n, left, mid, right);
}
}
int main()
{
int a[maxn],n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
unknownsort(a,n,0,n);
for(int i=0;i<n;i++)
{
if(i)
cout<<" ";
cout<<a[i];
}
cout<<endl;
return 0;
}
- 将第13行的“<”改为“<=”不会改变运行结果。( ) {{ select(28) }}
- 正确
- 错误
- 将第21行的“<”改为“<=”不会改变运行结果。( ) {{ select(29) }}
- 正确
- 错误
- .此类排序方法是高效的,但是不稳定。( ) {{ select(30) }}
- 正确
- 错误
- 将第4行的2个“+2”都去掉不会改变运行结果。( ) {{ select(31) }}
- 正确
- 错误
- 此题是哪种排序?( )
{{ select(32) }}
- 选择排序
- 桶排序
- 归并排序
- 堆排序
- 此题用到了( )思想。 {{ select(33) }}
- 动态规划
- 分治
- 冒泡
- 贪心
三、完善程序
单选题,除特殊说明外,每小题3分,共计30分。
(1) 田忌赛马,田忌每赢一次齐王的马就得200金币,当然输了就扣200金币,平局则金币数不变。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
while(cin>>n&&n!=0)
{
int tj[1001], king[1001], count=0;
int tj_min=0, tj_max=n-1;
int king_min=0, king_max=n-1;
for(int i=0;i<n;i++)
cin>>tj[i];
for(int i=0;i<n;i++)
cin>>king[i];
sort(tj,tj+n) ;
sort(king, king+n);
while(n--)
{
if( tj[ ① ]> king[ ② ])
{
count++ ;
tj_max --;
king_max --;
}
else if( tj[ ③ ]< king[ ④ ])
{
count -- ;
tj_min++;
king_max --;
}
else
{
if( tj[ tj_min]> king[ king_min])
{
count++;
⑤ ;
⑥ ;
}
else
{
if( ⑦ )
count-- ;
tj_min++;
⑧ ;
}
}
}
cout<<count*200<<endl;
}
return 0;
}
- ①处和②处填( )。 {{ select(34) }}
- tj_max 和 king_max
- tj_min 和 king_max
- tj_min 和 king_max
- tj_max 和 king_min
- ③处和④处填( )。 {{ select(35) }}
- tj_min 和 king_max
- tj_min 和 king_min
- tj_max 和 king_max
- tj_max 和 king_min
- ⑤处和⑥处填( )。 {{ select(36) }}
- tj_min-- 和 king_min++
- tj_max++ 和 king_min++
- tj_min++ 和 king_min++
- tj_max++ 和 king_min--
- ⑦处填( )。 {{ select(37) }}
- tj[ tj_min] < king[ king_max]
- tj[ tj_min] > king[ king_max]
- tj[ tj_max] < king[ king_max]
- tj[ tj_min] > king[ king_min]
- ⑧处填( )。 {{ select(38) }}
- king_max --
- king_max ++
- king_min --
- king_min ++
(2)(寻路问题) 寻路问题:N*N矩阵,其中0是表示可以走的,1表示无法走,矩阵由二维数组表示,左上角是入口,右下角是出口,只能横着走和竖着走,要求找出最短路径。
#include<bits/stdc++.h>
using namespace std;
int mymax=10000;
int f[4][2] = { { - 1 ,0} ,{1,0},{0,-1},{0,1}};
int a[20][20],v[20][20],v1[20][20];
int 1=1;
int n;//矩阵的规模
bool check(int x1, int y1)
{
if( x1<0|| x1>=n|| ① )
return false;
if(a[ x1][y1]==1|| ② )
return false;
return true;
}
void dfs(int x, int y)
{
if(x==n-1&&y==n-1)
{
if(l<mymax)
{
mymax=1;
memcpy(v1,v, sizeof(v1));
}
return;
}
for(int k=0;k<4;k++)
{
int x1 ,y1;
x1=x+ ③ ;
y1=y+ ④ ;
if(check(x1,y1))
{
⑤ ;
⑥ ;
dfs(x1, yl);
⑦ ;
v[x][y]=0 ,
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
dfs(0,0);
int d=v1[n-1][n-1];
int x=n-1,y=n-1;
int k;
int qn[400][2];
qn[0][0]=n- 1 ;
qn[0][1]=n-1;
for(k=1;;k++)
{
x=x-f[d][0];
y=y-f[d][1];
qn[k][0]=x;
qn[k][1]=y;
d=v1[x][y];
if(x==0&&y==0) break;
}
for(int i=k;i>=0;i--)
cout<< ⑧<<","<< ⑨<<endl;
return 0;
}
- ①处和②处填( )。 {{ select(39) }}
- y1<=0||y1>n和v[x1][y1]>0
- y1<0||y1>=n和v[x1][y1]>0
- y1>0&&y1<=n和v[x1][y1]>0
- y1>0&&y1<n和v[x1][y1]>0
- ③和④处填( )。 {{ select(40) }}
- f[k][o]和f[k][1]
- f[k][1]和f[k][0]
- f[0][k]和f[1][k]
- f[1][k]和f[0][k]
- ⑤处填( )。 {{ select(41) }}
- v[x1][y1]=k+1;
- v[x1][y1]=k;
- v[x][y]= k;
- v[x][y]=k+1 ;
- ⑥处和⑦处填( )。 {{ select(42) }}
- l++和l--
- k++和k--
- x1++和x1--
- y1++和y1--
- ⑧处和⑨处填( )。 {{ select(43) }}
- qn[i][1]和qn[i][2]
- qn[i][0]和qn[i][1]
- qn[1][i]和qn[2][i]
- qn[0][i]和qn[1][i]