#4447. 普及组 CSP-J 第2套初赛模拟试题

普及组 CSP-J 第2套初赛模拟试题

一.单项选择题

共15题,每题2分,共30分;每题有且仅有一个正确选项。

  1. 以下不是属于国家顶级域名的是( )。 {{ select(1) }}
  • .au
  • .cn
  • .com
  • .jp
  1. 2个10进制数1111和1010的异或运算结果的10进制表示是( )。 {{ select(2) }}
  • 101
  • 3
  • 1957
  • 5
  1. 8位二进制数中去掉符号位,最大能表示多少字符( )。

{{ select(3) }}

  • 127
  • 128
  • 255
  • 256
  1. 在写递归函数时,哪些定义一般不写在递归函数中?( )

{{ select(4) }}

  • int
  • float
  • double
  • 数组
  1. 一棵完全二叉树,共有1234个节点,其叶子结点的个数为( )。

{{ select(5) }}

  • 615
  • 616
  • 617
  • 210
  1. 某公司派赵钱孙李周五人出国学习,选派条件是:
    a.若赵去,钱也去;

b.李、周两人必有一人去;

c.若周去,则赵、钱也同去;

d.孙、李二人同去或同不去;

如何选他们出国?( )

{{ select(6) }}

  • 孙赵周去
  • 赵钱周去
  • 李周孙去
  • 钱孙去
  1. 已知一棵二叉树前序遍历为ABCDEFGI,后序遍历为CEDBIGFA,则其中序遍历可能为( )。 {{ select(7) }}
  • ABCDEFGI
  • CBEDAFIG
  • CBDEAGFI
  • CBEDAIFG
  1. 8颗子弹,编号为1,2,3,4,5,6,7,8,从编号1开始按序嵌入弹夹,以下不是正常的打出子弹的次序的是( )。

{{ select(8) }}

  • 12345678
  • 87654321
  • 32154876
  • 32164587
  1. 已知循环队列空间为30,队头位置编号为12,队尾元素下一个空位置编号为5,则队伍中元素个数为( )。

{{ select(9) }}

  • 22
  • 23
  • 7
  • 8
  1. 甲箱中有200个螺杆,其中有160个A型螺杆;乙箱中有240个螺母,其中有180个A 型的。现从甲乙两箱中各任取一个,则能配成A型螺栓的概率为多少?( )

    {{ select(10) }}

  • 1/20
  • 19/20
  • 3/5
  • 15/16
  1. 今年信息学进复赛的同学有6人,老师将他们排成一圈分发奖品,一共有( )种排法。 {{ select(11) }}
  • 60
  • 120
  • 180
  • 240
  1. 设二维数组A的行下标为0至5,列下标为1至5,F的每个数据元素均占2个字节。在按行存贮的情况下,已知数据元素A[3][3]的第一个字节是2019,则A[4][4]的第一个字节的地址为( )。 {{ select(12) }}
  • 2029
  • 2025
  • 2027
  • 2031
  1. 在下图中,有( )个顶点出发存在一条路径可以遍历图中的每条边,而且仅遍历一次。

![image](file://2kYra52g51mg5Fd-HNuCy.png)

{{ select(13) }}

  • 6
  • 2
  • 3
  • 4
  1. 有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拿
  1. 以下不属于应用层的是( )。 {{ 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;
}
  1. 输出的字符串只能是字母组成。( ) {{ select(16) }}
  • 正确
  • 错误
  1. 若将12行的“<”改为“<=”,则输出结果有可能包含数字。( ) {{ select(17) }}
  • 正确
  • 错误
  1. 将第9行删除,程序运行结果不会改变。( ) {{ select(18) }}
  • 正确
  • 错误
  1. 若将11行删除,则输出字符的长度和输入字符的长度一致。( ) {{ select(19) }}
  • 正确
  • 错误
  1. 若输入的字符串长度为10,则输出的字符串长度最长可能为( )。 {{ select(20) }}
  • 4
  • 5
  • 6
  • 10
  1. (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;
}
  1. 输入10个数字,输出结果是从小到大。( ) {{ select(22) }}
  • 正确
  • 错误
  1. 若输入的数字中有两个1,则输出时出来第一个1是第一个输入的。( ) {{ select(23) }}
  • 正确
  • 错误
  1. 若将第13行的“<=”改为“<”,且输入数据为10 2 12 33 34 1 2 87 22 9 0,则输出2。( ) {{ select(24) }}
  • 正确
  • 错误
  1. 若将第12行改为 for(i=0;i<=1000;i++),则程序运行结果不变。( ) {{ select(25) }}
  • 正确
  • 错误
  1. 若将第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
  1. 若将第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;
}
  1. 将第13行的“<”改为“<=”不会改变运行结果。( ) {{ select(28) }}
  • 正确
  • 错误
  1. 将第21行的“<”改为“<=”不会改变运行结果。( ) {{ select(29) }}
  • 正确
  • 错误
  1. .此类排序方法是高效的,但是不稳定。( ) {{ select(30) }}
  • 正确
  • 错误
  1. 将第4行的2个“+2”都去掉不会改变运行结果。( ) {{ select(31) }}
  • 正确
  • 错误
  1. 此题是哪种排序?( )

{{ select(32) }}

  • 选择排序
  • 桶排序
  • 归并排序
  • 堆排序
  1. 此题用到了( )思想。 {{ 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;
}
  1. ①处和②处填( )。 {{ select(34) }}
  • tj_max 和 king_max
  • tj_min 和 king_max
  • tj_min 和 king_max
  • tj_max 和 king_min
  1. ③处和④处填( )。 {{ select(35) }}
  • tj_min 和 king_max
  • tj_min 和 king_min
  • tj_max 和 king_max
  • tj_max 和 king_min
  1. ⑤处和⑥处填( )。 {{ select(36) }}
  • tj_min-- 和 king_min++
  • tj_max++ 和 king_min++
  • tj_min++ 和 king_min++
  • tj_max++ 和 king_min--
  1. ⑦处填( )。 {{ 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]
  1. ⑧处填( )。 {{ 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;
}
  1. ①处和②处填( )。 {{ 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
  1. ③和④处填( )。 {{ 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]
  1. ⑤处填( )。 {{ select(41) }}
  • v[x1][y1]=k+1;
  • v[x1][y1]=k;
  • v[x][y]= k;
  • v[x][y]=k+1 ;
  1. ⑥处和⑦处填( )。 {{ select(42) }}
  • l++和l--
  • k++和k--
  • x1++和x1--
  • y1++和y1--
  1. ⑧处和⑨处填( )。 {{ 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]