#CSP006. 入门级CSP-J第6套初赛模拟试题

入门级CSP-J第6套初赛模拟试题

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

  1. 在计算机内部用来传送、存贮、加工处理的数据或指令都是以( )形式进行的。 {{ select(1) }}
  • 二进制码
  • 八进制码
  • 十进制码
  • 智能拼音码
  1. 计算机的软件系统通常分为()。 {{ select(2) }}
  • 硬件系统和软件系统
  • 高级软件和一般软件
  • 系统软件和应用软件
  • 军用软件和民用软件
  1. 关于软盘读写孔,正确的说法是( )。 {{ select(3) }}
  • 从该孔读信息
  • 从该孔写信息
  • 当该孔处于开状态时,不能删除盘中文件
  • 该孔没有作用
  1. 一棵二叉树的中序遍历为DBACHF,后序遍历为DBEHFCA,则前序遍历是( )。 {{ select(4) }}
  • ABCDFGHE
  • ABDGCEFH
  • ACBGDHEF
  • ACEFHBGD
  1. 下列叙述中错误的是()。 {{ select(5) }}
  • 微机应避免置于强磁场之中
  • 微机使用时间不宜过长,而应隔几个小时关机一次
  • 微机应避免频繁关开,以延长其使用寿命
  • 微机应经常使用,不宜长期闲置不用
  1. 计算机网络最主要的优点是()。 {{ select(6) }}
  • 运算速度快
  • 共享资源
  • 精度高
  • 存储容量大
  1. 下列4个不同进制表示的数中,最大的一个数是()。 {{ select(7) }}
  • (220.1)₁₀
  • (11011011.1)₂
  • (334.1)₈
  • (DC.1)₁₆
  1. 为了区分汉字与ASCII码,计算机中汉字编码的最高位为( )。 {{ select(8) }}
  • 1
  • 0
  • -1
  • 2
  1. 一般来说,TCP/IP的IP提供的服务是( )。 {{ select(9) }}
  • 运输层服务
  • 会话层服务
  • 表示层服务
  • 网络层服务
  1. 通信时,模拟信号也可以用数字信道来传输,能实现模拟信号与数字信号之间转换功能的是( )。 {{ select(10) }}
  • D/A
  • A/D
  • Modem
  • Codec
  1. 一个栈的输入顺序为1、2、3、4、5,下列序列中可能是栈的输出序列是( )。 {{ select(11) }}
  • 54312
  • 24135
  • 21543
  • 12534
  1. 不属于Internet的功能是( )。 {{ select(12) }}
  • 聊天
  • 远程教育
  • 查询资料
  • 传送能量
  1. 下列描述计算机病毒的特性中,( )不是正确的。 {{ select(13) }}
  • 潜伏性
  • 传染性
  • 高速性
  • 危害性
  1. 下面不属于网络操作系统的是( )。 {{ select(14) }}
  • UNIX
  • WINDOWS NT
  • NETWARE
  • DOS
  1. 根据《计算机软件保护条例》,中国公民开发的软件享有著作权的是( )。 {{ select(15) }}
  • 不论何人、何地及发表与否的软件
  • 只有公开发表的软件
  • 只有单位发表的软件
  • 只有个人在国内公开发表的软件

二、阅读程序(共计40分;判断题每题1.5分,选择题每题4分)

(一)归并排序

#include<bits/stdc++.h>
using namespace std;
const int Maxn=10005;
int n,b[Maxn];
inline void mergesort(int*a,int l,int r){
    if(l==r)return;
    int mid=l+r>>1;
    mergesort(a,l,mid),mergesort(a,mid+1,r);
    int i=l,j=mid+1,cnt=0;
    while(i<=mid && j<=r){
        if(a[i]<=a[j]) b[++cnt]=a[i++];
        else b[++cnt]=a[j++];
    }
    while(i<=mid) b[++cnt]=a[i++];
    while(j<=r) b[++cnt]=a[j++];
    for(i=l;i<=r;i++)a[i]=b[i-l+1];
}
int a[Maxn];
int main(void){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    mergesort(a,1,n);
    for(int i=1;i<=n;i++) cout<<a[i]<<(i==n?'\n':' ');
    return 0;
}

判断题 16. 该算法中"int*a"没有传值。() {{ select(16) }}

  • 正确
  • 错误
  1. 该算法会换行。() {{ select(17) }}
  • 正确
  • 错误
  1. 该算法中mergesort函数时间复杂度为O(nlogn)。() {{ select(18) }}
  • 正确
  • 错误
  1. 如果输入为"5 4 3 9 7 8"则输出为3 4 7 8 9\n。() {{ select(19) }}
  • 正确
  • 错误

选择题 20. 下面哪句与"i==n?'\n':' '"相同()。 {{ select(20) }}

  • i!=1?'\n':' '
  • "\n"[i==n]
  • "\n"[i!=n]
  • ' '
  1. 该算法的最劣复杂度与哪个排序算法相同()。 {{ select(21) }}
  • 快速排序
  • 选择排序
  • 计数排序
  • 堆排序

(二)并查集

#include<bits/stdc++.h>
using namespace std;
int i,j,k,n,m,f[10010],p1,p2,p3;
int find(int k){
    if(f[k]==k)return k;
    return f[k]=find(f[k]);
}
int main()
{
    cin>>n>>m;
    for(i=1;i<=n;i++)f[i]=i;
    for(i=1;i<=m;i++){
        cin>>p1>>p2>>p3;
        if(p1==1)
            f[find(p2)]=find(p3);
        if(p1==2)
            if(find(p2)==find(p3))
                printf("Y\n");
            else
                printf("N\n");
    }
    return 0;
}

判断题 22. 该算法中p1的作用是确定操作类型。() {{ select(22) }}

  • 正确
  • 错误
  1. 去掉for(i=1;i<=n;i++)f[i]=i;对该算法没有影响。() {{ select(23) }}
  • 正确
  • 错误
  1. 输入2 2 1 1 2 2 1 2输出为Y。() {{ select(24) }}
  • 正确
  • 错误
  1. 输入2 1 2 1 2输出为N。() {{ select(25) }}
  • 正确
  • 错误

选择题 26. 该算法时间复杂度为( )。 {{ select(26) }}

  • O(m log n)
  • O(nm)
  • O(n+m)
  • O(nm²)
  1. 把return f[k]=find(f[k]);改成return find(f[k]);最差时间复杂度为( )。 {{ select(27) }}
  • O(m log n)
  • O(nm)
  • O(n+m)
  • O(nm²)

(三)因数分解递归

int t,x[100],a[100];
void work(int d,int i,int n){
    int k;
    if(n==1)
    {
        for(k=0;k<d;k++)
            printf("%3d",a[k]);
        printf("\n");
    }
    else
        for(k=i;k<t;k++)
            if(n%x[k]==0)
            {
                a[d]=x[k];
                work(d+1,k,n/x[k]);
            }
}
int main(){
    int i,k,n;
    cin>>n;
    for(i=n;i>1;i--)if(n%i==0) x[t++]=i;
    work(0,0,n);
}

判断题 28. for(i=n;i>1;i--)if(n%i==0) x[t++]=i 的作用是求出n的所有因数。() {{ select(28) }}

  • 正确
  • 错误
  1. 该程序的作用是对n进行质因数分解。() {{ select(29) }}
  • 正确
  • 错误
  1. printf("%3d",a[k]);中去掉3对程序没有影响。() {{ select(30) }}
  • 正确
  • 错误
  1. 去掉if(n%x[k]==0)对程序有影响。() {{ select(31) }}
  • 正确
  • 错误

选择题 32. 如果输入为2,那么输出为( )。 {{ select(32) }}

  • 2
  • 2 1
  • 1 2
  • 2 2
  1. 如果输入为72,那么输出的非空行有多少行()。 {{ select(33) }}
  • 14
  • 15
  • 16
  • 17

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

(一)坐标统计(战斗力)

输入n个整点在平面上的坐标。对于每个点,可以控制所有位于它左下方的点(即x、y坐标都比它小),它可以控制的点的数目称为"战斗力"。依次输出每个点的战斗力,最后输出战斗力最高的点的编号(如果若干个点的战斗力并列最高,输出其中最大的编号)。

#include<iostream>
using namespace std;
const int SIZE=100;
int x[SIZE],y[SIZE],f[SIZE];
int n,i,j,max_f,ans;
int main()
{
    cin>>n;
    for(i=1;i<=n;i++) cin>>x[i]>>y[i];
    max_f=0;
    for(i=1;i<=n;i++)
    {
        f[i]= ① ;
        for(j=1;j<=n;j++)
        {
            if(x[j]<x[i] && ② )
                ③ ;
        }
        if( ④ )
        {
            max_f=f[i];
            ⑤ ;
        }
    }
    for(i=1;i<=n;i++) cout<<f[i]<<endl;
    cout<<ans<<endl;
    return 0;
}
  1. ①处应该填( )。 {{ select(34) }}
  • 0
  • 1
  • i
  • INT_MAX
  1. ②处应该填( )。 {{ select(35) }}
  • y[j]<=y[i]
  • y[j]<y[i]
  • y[j]>y[i]
  • y[j]>=y[i]
  1. ③处应该填( )。 {{ select(36) }}
  • ans=i
  • f[i]++
  • f[i]--
  • ans++
  1. ④处应该填( )。 {{ select(37) }}
  • (f[i]>max_f)
  • (f[i]>=max_f)
  • (f[i]<max_f)
  • (f[i]<=max_f)
  1. ⑤处应该填( )。 {{ select(38) }}
  • ans++
  • ans+=max_f
  • ans =i
  • ans =max_f

(二)排列数生成

输入两个正整数n,m(1<n<20,1<m<n),在1~n中任取m个数,按字典序从小到大输出所有这样的排列。

#include<iostream>
#include<cstring>
using namespace std;
const int SIZE=25;
bool used[SIZE];
int data[SIZE];
int n,m,i,j,k;
bool flag;
int main()
{
    cin>>n>>m;
    memset(used,false,sizeof(used));
    for(i=1;i<=m;i++)
    {
        data[i]=i;
        used[i]=true;
    }
    flag=true;
    while(flag)
    {
        for(i=1;i<=m-1;i++)
            cout<<data[i]<<" ";
        cout<<data[m]<<endl;
        flag= ① ;
        for(i=m;i>=1;i--)
        {
            ② ;
            for(j=data[i]+1;j<=n;j++)
                if(!used[j])
                {
                    used[j]=true;
                    data[i]= ③ ;
                    flag=true;
                    break;
                }
            if(flag)
            {
                for(k=i+1;k<=m;k++)
                    for(j=1;j<= ④ ;j++)
                        if(!used[j])
                        {
                            data[k]=j;
                            used[j]=true;
                            break;
                        }
                 ⑤ ;
            }
        }
    }
    return 0;
}
  1. ①处应该填( )。 {{ select(39) }}
  • false
  • true
  • 1
  • -1
  1. ②处应该填( )。 {{ select(40) }}
  • used[i]=true
  • data[i]=i
  • used[data[i]]=true
  • used[data[i]]=false
  1. ③处应该填( )。 {{ select(41) }}
  • j
  • i
  • true
  • false
  1. ④处应该填()。 {{ select(42) }}
  • n
  • m
  • i
  • j
  1. ⑤处应该填()。 {{ select(43) }}
  • return 0
  • exit
  • continue
  • break