#CSP002. 入门级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. 已知一棵二叉树前序遍历为ABCDEFCI,后序遍历为CEDBICFA,则其中序遍历可能为 ()。 {{ select(7) }}
  • ABCDEFGI
  • CBEDAFIG
  • CBDEAGFI
  • CBEDAIFC
  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,每个数据元素均占2个字节。在按行存贮的情况下,已知数据元素A[3][3]的第一个字节是2019,则A[4][4]的第一个字节的地址为( )。 {{ select(12) }}
  • 2029
  • 2025
  • 2027
  • 2031
  1. 在下图中,有( )个顶点出发存在一条路径可以遍历图中的每条边,而且仅遍历一次。 {{ 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

二、阅读程序(共计40分;判断题每题1.5分,选择题每题3分,特殊标注除外)

(一)

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    char s1[100];
    int len,j=0;
    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;
}

判断题 16. 输出的字符串只能是字母组成。() {{ select(16) }}

  • 正确
  • 错误
  1. 若将第12行的"<"改为"<=",则输出结果有可能包含数字。() {{ select(17) }}
  • 正确
  • 错误
  1. 将第9行删除,程序运行结果不会改变。() {{ select(18) }}
  • 正确
  • 错误
  1. 若将第11行删除,则输出字符的长度和输入字符的长度一致。() {{ select(19) }}
  • 正确
  • 错误

选择题 20. 若输入的字符串长度为10,则输出的字符串长度最长可能为()。 {{ select(20) }}

  • 4
  • 5
  • 6
  • 10
  1. 若输入的字符串都是字母,则输出中可能出现()。 {{ select(21) }}
  • A
  • Z
  • a
  • 以上都不对

(二)

#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;
}

判断题 22. 输入10个数字,输出结果是从小到大。() {{ select(22) }}

  • 正确
  • 错误
  1. 若输入的数字中有两个1,则输出时出来第一个1是第一个输入的。() {{ select(23) }}
  • 正确
  • 错误
  1. 若将第13行的"<="改为"<",且输入数据为1 0 2 1 2 3 3 3 4 1 2 8 7 2 2 9 0,则输出2。() {{ select(24) }}
  • 正确
  • 错误
  1. 若将第12行改为for(i=0;i<=1000;i++),则程序运行结果不变。() {{ select(25) }}
  • 正确
  • 错误

选择题 26. 若将第12行改为for(i=1000;i>1;i--);第13行为for(j=a[i];j>1;j--),输入数据为5 2 1 2 3 3 3 4 4 4,则运行结果( )。 {{ select(26) }}

  • 不变
  • 输出2 1 2 3 3 3 4 4 4
  • 无输出
  • 输出44 34 33 12 2
  1. 若将第10行改为++a[t]或a[t++],则输入5 1 2 3 4 5,输出结果为()。 {{ select(27) }}
  • 12345或54321
  • 12345或无输出
  • 54321或54321
  • 54321或无输出

(三)

#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++){
        cout<<a[i];
        if(i)cout<<" ";
    }
    cout<<endl;
    return 0;
}

判断题 28. 将第13行的"<"改为"<="不会改变运行结果。() {{ select(28) }}

  • 正确
  • 错误
  1. 将第21行的"<"改为"<="不会改变运行结果。() {{ select(29) }}
  • 正确
  • 错误
  1. 此类排序方法是高效的,但是不稳定。() {{ select(30) }}
  • 正确
  • 错误
  1. 将第4行的2个"+2"都去掉不会改变运行结果。() {{ select(31) }}
  • 正确
  • 错误

选择题 32. 此题是哪种排序?()。 {{ select(32) }}

  • 选择排序
  • 桶排序
  • 归并排序
  • 堆排序
  1. 此题用到了()思想。 {{ select(33) }}
  • 动态规划
  • 分治
  • 冒泡
  • 贪心

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

(一)田忌赛马

田忌每赢一次齐王的马就得200金币,输了就扣200金币,平局则金币数不变。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    while(cin!=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++

(二)寻路问题

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 l=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=l;
            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,y1);
            ⑥
            ⑦
        }
    }
}
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][0]和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]