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

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

一.单项选择题

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

  1. 关于CPU下面哪些说法是正确的?( ) {{ select(1) }}
  • CPU全称为中央控制器
  • CPU能直接运行机器语言
  • CPU最早是由Intel公司发明的
  • 同样主题下,32位的CPU比16位的CPU运行速度快一倍
  1. 在字长为16位的系统环境下,一个16位带附号整数的进制补码为1111111111101101。其对应的十进制整数应该是( ) {{ select(2) }}
  • 19
  • -19
  • 18
  • -18
  1. 在计算机内部,用来传送、存储、加工处理的数据或指令(命令)都是以( )形式进行的。

{{ select(3) }}

  • 十进制码
  • 二进制码
  • 智能拼音码
  • 五笔字型码
  1. 排序算法是稳定的意思是关键码相同的记录排序前后相对位置不发生改变,下列哪种排序算法不是稳定的?( )

{{ select(4) }}

  • 插入排序
  • 基数排序
  • 堆排序
  • 归并排序
  1. 一棵6节点二叉树的中序遍历为DBAGECF,先序遍历为ABDCEGF,后序遍历为( )

{{ select(5) }}

  • DCBEFAC
  • CBEACFD
  • DBGEFCA
  • ABCDEFG
  1. 应用快速排序的分治思想,可以实现一个求第K大数的程序。假定不考虑极端的最坏情况,理论上可以实现的最低的算法时间复杂度为( )

{{ select(6) }}

  • O(logn)
  • O(nlogn)
  • O(n)
  • O(1)
  1. 若3个顶点的无权图G的邻接矩阵用数组存储为{{0,1,1},{1,0,1},{0,1,0}},假定在具体存储中顶点依次为:v1v_1v2v_2v3v_3。关于该图,下面的说法哪个是错误的?( ) {{ select(7) }}
  • 该图是有向图
  • 该图是强联通的
  • 该图所有顶点的入度之和减所有顶点的出度之和等于1
  • 从v₁开始的深度优先遍历所经过的顶点序列与广度优先的顶点序列是相同的
  1. 2019年10月14日是星期一,1978年10月14日是( )。

{{ select(8) }}

  • 星期日
  • 星期五
  • 星期一
  • 星期六
  1. 表达式a*(b+c)d的后缀表达式是( )。

{{ select(9) }}

  • abcd*+-
  • abc+*d-
  • abc*+d-
  • -+*abcd
  1. 某算法计算时间表示为递推关系式:T(N)=N+T(N/2),则该算法时间复杂度为( )。 {{ select(10) }}
  • O(N2)O(N^2)
  • O(NlogN)O(NlogN)
  • O(N)O(N)
  • O(1)O(1)
  1. 如果根结点的深度记为1,则一棵恰有2011个叶子结点的二叉树的深度不可能是( )。 {{ select(11) }}
  • 11
  • 12
  • 13
  • 2011
  1. 对于序列“7,5,1,9,3,6,8,4”,在不改变顺序的情况下,去掉( )会使逆序对的个数减少3。 {{ select(12) }}
  • 7
  • 5
  • 4
  • 6
  1. 某班有50名学生,每位学生发一张调查卡,上写a、b、c三本书的书名,将读过的书打✔,结果统计数字如下:只读a者8人;只读b者4人;只读c者3人;全部读过的有2人;读过a,b两本书的有4人;读过a、c两本书的有2人;读过b、c两本书的有3人。则读过a的人数是( )。

{{ select(13) }}

  • 10人
  • 30人
  • 12人
  • 24人
  1. 一家三口人,恰有两个人生日在同一天的概率是( )。(假设每年都是365天) {{ select(14) }}
  • 1/365
  • 365/( 364×365)
  • ( 3×364)/( 365×365)
  • 1/12
  1. 字符串“abeab”本质不同的子串(不包含空串)个数( )。 {{ select(15) }}
  • 15
  • 14
  • 13
  • 12

二、阅读程序

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

(1)

#include <bits/stdc++.h> 
using namespace std;
int  main(){
    int  a[4],b[4];
    int i,j, tmp;
    for  ( i = 0;i < 4;i++)
		scanf(" %d",&b[i]);
    for ( i = 0;i < 4;i++) {
        a[i]  = 0;
        for ( j = 0;j < = i;j++) {
            a[i]  + =  b[j];
            b[a[i] % 4] + = a[j];
        }
    }
    tmp = 1 ;
      for ( i = 0;i < 4;i++) {
           a[i] %= 10;
           b[i] %= 10;
           tmp  *= a[i] + b[i];
     }
    printf("%d", tmp);
    return 0;
}
  1. (1分)若输入的b数组都是奇数,程序运行到第15行时,b[2]没有发生变化。( ) {{ select(16) }}
  • 正确
  • 错误

17.若将第11行和第12行交换,程序的结果可能发生变化。( ) {{ select(17) }}

  • 正确
  • 错误
  1. 当程序运行到第15行时,此时a数组的值等于b数组的值。( ) {{ select(18) }}
  • 正确
  • 错误
  1. 若输入b数组都是偶数,当程序运行到第15行时,a数组中的值也全部为偶数。( ) {{ select(19) }}
  • 正确
  • 错误
  1. 该程序能输出的最大结果为( )。 {{ select(20) }}
  • 6561
  • 10000
  • 104976
  • 43046721
  1. 若输入2357,输出的结果为( )。 {{ select(21) }}
  • 210
  • 5850
  • 3360
  • 103680

(2)

#include<ctype.h>
#include<stdio.h>
void expand(char s1[],char s2[])
{
    int   i,j,a,b,c;
    j=0;
    for( i=0;(c=s1[1]) !=' ';i++)
    	if(c=='-')
        {
        a=s1[i-1];b=s1[i+1];
        if(isalpha(a)&&isalpha(b)|| isdigit(a)&&isdigit(b))
        {
        j-- ;
        do
            s2[j++] = a++;
        while( tolower(a)
    	}
        else s2[j++] = c;
    } else s2[j++] = c;
    s2[j]  = '';
}
main()
{
    char s1[100],s2[300];
    printf( "input s1:");
    gets( s1 );
    expand(s1,s2);
   printf( "%s",s2 );
}
/*
函数isalpha(a)用于判断字符a是否为字母, isigit(b)用于判断字符b是否为数字,如果是,返回1,否则返回0。                        
函数tlower(a)的功能是当字符a是大写字母,返回其小写字母,其余情况不变
规定:输入的字符串只包含大小写字母,数字和“-”,且保证“-”不会出现在首位和末位。
*/
  1. (1分)若输入的字符串不包含“-”号,则输出的字符串和输入相同。( ) {{ select(22) }}
  • 正确
  • 错误
  1. 若输入的字符串包含“-”号,输出的字符串长度可能与输入的相同。( ) {{ select(23) }}
  • 正确
  • 错误

24.若存在一个字符,只存在于s2字符串中而不存在于s1字符串中,则s1字符串中一定存在“-”号。( )
{{ select(24) }}

  • 正确
  • 错误
  1. 若存在一个字符,只存在于s2字符串中而不存在于s1字符串中,则该字符一定不可能是大写字母。( ) {{ select(25) }}
  • 正确
  • 错误
  1. 若输入6个字符,最多输出( )个字符。 {{ select(26) }}
  • 6
  • 20
  • 52
  • 54
  1. 若输出500个字符,至少输入( )个字符。 {{ select(27) }}
  • 20
  • 5
  • 60
  • 500

(3)

#include<iostream> 
#include<cstring>                                   
#include<cstdio>
#define N 500+10
using namespace std;
int  a[N],n;
int main()
{
    cin>>n;
    for(int  i=1;i<=n;++i) cin>>a[i];
    for(int  i=1;i<=n;++i)
    {
		int tmp=i;
    	for(int  j=i+1;j<=n;++j)
            if(a[j]<a[tmp]) tmp=j;
        swap(a[i],a[tmp]);
    }
    for(int i=1;i<=n;十+i) cout<
    cout<<endl;
    return 0;
}
  1. 上述代码实现了对一个长度为n的序列进行排队。( ) {{ select(28) }}
  • 正确
  • 错误
  1. 去掉头文件“#include"后程序依然正常编译运行。( ) {{ select(29) }}
  • 正确
  • 错误
  1. 去掉“using namespace std;”后程序仍然正常编译运行。( ) {{ select(30) }}
  • 正确
  • 错误
  1. 我们将上述算法称为( ) {{ select(31) }}
  • KMP
  • 冒泡排序
  • 选择排序
  • 归并排序
  1. 上述代码的时间复杂度为( ) {{ select(32) }}
  • O(n)
  • O(nlogn)
  • O(n2n^2)
  • O(n3n^3)
  1. 若输入数据为:
5
3 2 1 5 4

则if(a[j]<a[tmp])这句话中的条件会成立( )次(即后面的tmp = j会被执行多少次)

{{ select(33) }}

  • 5
  • 7
  • 3
  • 4

三、完善程序

单选题,除特殊说明外,每小题3分,共计30分。

  • (1)(最大连续子段和)
    给出一个数列(元素个数不多于100),数列元素均为负整数、正整数、0。请找出数列中的一个连续子数列,使得这个子数列中包含的所有元素之和最大,在和最大的前提下还要求该子数列包含的元素个数最多,并输出这个最大和以及该连续子数列中元素的个数。例如数列为4,-5,3,2,4时,输出9和3;数列为1,2,3,-5,0,7,8时,输出16和7。
#include <iostream>
using namespace std;
int  a[101];
int n,i, ans, len, tmp, beg, end;
int main(){
    cin >> n;
	for ( i = 1 ;i < = n;i++)
       cin  > > a[i] ;
    tmp  = 0;
    ans = 0;
    len  =  0 ;
    beg=   ①   ;
    for  ( i = 1 ;i < = n;i++)  {
        if (tmp + a[i] > ans) {
            ans=tmp+a[i];
            len=i- beg;
       }
        else if( ② &&i-beg>len)
               len =i -beg;
         }
        
             beg =   ④ ;
             tmp  = 0;
        }else
                ⑤   ;
  }
  cout << ans<< " " << len << end1;
   return 0;
}
  1. ①处应填() {{ select(34) }}
  • 0
  • 1
  • n
  • -1
  1. ②处应填() {{ select(35) }}
  • tmp==ans
  • a[i]+tmp<=ans
  • a[i]+tmp==ans
  • tmp<=ans
  1. ③处应填() {{ select(36) }}
  • ==0
  • <ans
  • <0
  • <=0
  1. ④处应填() {{ select(37) }}
  • 1
  • n
  • i
  • 0
  1. ⑤处应填() {{ select(38) }}
  • tmp=0
  • len++
  • beg=i
  • tmp+=a[i]

(2)(棋盘覆盖问题) 在一个2ᵏ×2ᵏ个方格组成的棋盘中恰有一个方格与其他方格不同(如图中标记为-1的方格),称之为特殊方格。现用L形(占3个小方格)纸片覆盖棋盘上除特殊方格的所有部分,各纸片不得重叠,于是,用到的纸片数恰好是(4k1)/3(4^k-1)/3 在下面给出的覆盖方案例子中,k=2,相同的3个数字构成一个纸片。下面给出的程序使用分治法设计的,将棋盘一分为四,依次处理左上角、右上角、左下角、右下角,递归进行。 请将程序补充完整。 例:

2	2	3	3
2	-1	1	3
4	1	1	5
4	4	5	5
// -1为特殊方格的位置,其他数字表示L形方格放置的顺序
#include<bits/stdc++.h>
using namespace std;
nt board[65][65], tile;//tile为纸片编号
void chessboard(int tr, int tc, int dr, int dc, int size)
{   /*dr, dc依次为特殊方格的行、列号*/
	int t,s;
		if ( size==1)
		return ;
	t= tile++;
	s = size /2;
	if(①   )
		chessboard(tr, tc, dr, dc,s);
	else {
		board[tr+s-1][tc+s-1] = t;
        ②   ;
}
if( dr<tr+s&&dc <tc+s)
	chessboard(tr, tc +s, dr, dc,s);
else {
	board[tr + s -1][tc+ s]=t;
    ③   ;
}
if( dr>=tr + s &&dc <ts+s)
	chessboard(tr +s, tc, dr, dc,s);
else {
	board[tr  + s][tc+ s -1] = t;
   	④   ;
}
if( dr>=tr+ s&&dc>=tc+s)
	chessboard( tr +s, tc +s, dr, dc,s);
else { board[tr + s][tc +s]=t;
   ⑤   ;}
}

void  prtl( int  b[][65], int n)
{
	int i,j;
	for ( i=1;i <= n;i++ )
	{
		for ( j = 1 ;j <= n;j++ )
			cout << setw(3) << b[i][j];
	cout <<endl; 
	}
}

int  main() {
	int size, dr, dc;
    cout <<"input  size(4/8/16/64):"<< endl;
    cin>> size;
    cout<<"input the position of special block(x,y):"<
    cin>>dr>>dc;
    board[dr][dc]= -1;
    tile++ ;
    chessboard( 1,1, dr, dc, size);
    prtl(board, size);
}	
  1. ①处应填() {{ select(39) }}
  • (dr< tr+s)&&(dc >= tc+s)
  • (dr<=tr+s)&&(dc<=tc+s)
  • (dr< tr+s)&&(dc< tc+s)
  • (dr>= tr+s)&&(dc < tc+s)
  1. ②处应填( ) {{ select(40) }}
  • chessboard(tr+s, tc,t+s, tc+s-1,s)
  • chessboard(tr, tc, tr+s-1, tc+s-1,s)
  • chessboard(tr, tc+s, tr+s—1, tc+s,s)
  • chessboard(tr, tc, tr+s, tc+s,s)
  1. ③处应填( ) {{ select(41) }}
  • chessboard(tr, tc, tr+s-1, tc+s-1,s)
  • chessboard(tr+s, tc, tr+s, tc+s-1,s)
  • chessboard(tr+s, tc+s, tr+s, tc+s,s)
  • chessboard(tr, tc+s, tr+s—1. tc+s,s)
  1. ④处应填( ) {{ select(42) }}
  • chessboard(tr, tc+s, tr+s-1. tc+s,s)
  • chessboard(tr+s, tc+s, tr+s, tc+s,s)
  • chessboard(tr, tc, tr+s—1, tc+s—1,s)
  • chessboard(tr+s, tc, tr+s, tc+s-1,s)
  1. ⑤处应填( ) {{ select(43) }}
  • chessboard(tr, tc, tr+s—1, tc+s—1,s)
  • chessboard(tr, tc+s, tr+s-1, tc+s,s)
  • chessboard(tr+s, tc, tr+s, tc+s-1,s)
  • chessboard(tr+s, tc+s, tr+s, tc+s,s)