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

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

  1. 下列关于解释程序和编译程序的四条叙述,其中正确的是( ) {{ select(1) }}
  • 解释程序产生目标程序
  • 编译程序产生目标程序
  • 解释程序和编译程序都产生目标程序
  • 解释程序和编译程序都不产生目标程序
  1. 十进制数(-123)的原码表示为( ) {{ select(2) }}
  • 11111011
  • 10000100
  • 1000010
  • 01111011
  1. 网络管理员排查无法访问www.cisco.com的故障,发现在浏览器中键入web服务器的IP地址可以访问网页,那故障应该归咎于哪个应用层协议( ) {{ select(3) }}
  • DHCP
  • DNS
  • HTTP
  • POP3
  1. 以下程序段执行完毕后,输出的结果是( )
#include<bits/stdc++.h>
using namespace std;
int prime(int n){
    int i,y=1;
    for(i=2;i*i<=n;i++){
        if(n%i==0){
            y=0;
            break;
        }
    }
    return y;
}
int main(){
    int m=90,n=100;
    while(m!=(n+1)){
        if(prime(m)==1) cout<<m<<" ";
        m++;
    }
    return 0;
}

{{ select(4) }}

  • 91
  • 97
  • 91 97
  • 91 95 97
  1. 若已知一个栈的入栈序列是1,2,3...n,其输出序列为p1,p2,p3...pn,若p1=n,则pi为( ) {{ select(5) }}
  • i
  • n-i
  • n-i+1
  • 不确定
  1. 使用分治法求解不需要满足的条件是( ) {{ select(6) }}
  • 子问题必须是一样的
  • 子问题不能够重复
  • 子问题的解可以合并
  • 原问题和子问题使用相同的方法解
  1. 在5×7的方格表中有多少个指定L形的图形?( ) {{ select(7) }}
  • 42
  • 15
  • 76
  • 20
  1. 堆的形状是一棵( ) {{ select(8) }}
  • 二叉排序树
  • 满二叉树
  • 完全二叉树
  • 平衡二叉树
  1. 围着一张圆桌给3名男生,6名女生安排座位,座位没有编号。如果两名男生之间恰有两名女生,共有多少种安排座位的方法( ) {{ select(9) }}
  • 392880
  • 1440
  • 2160
  • 720
  1. 100以内的质数有( )个。 {{ select(10) }}
  • 25
  • 26
  • 27
  • 28
  1. 4名嘉宾和2名领导站成一排参加剪彩,其中领导不能相邻,则站位方法总数为( ) {{ select(11) }}
  • 720
  • 480
  • 120
  • 60
  1. 一盒围棋子,4个4个数多3个,6个6个数多5个,15个15个数多14个,棋子在150~200个,棋子共几个?( ) {{ select(12) }}
  • 167
  • 179
  • 194
  • 以上都不对
  1. 数据结构中,"先进先出"是( )结构的特征。 {{ select(13) }}
  • 队列
  • 线性表
  1. 二叉树的中序序列是( ) {{ select(14) }}
  • DHEBAFIJCG
  • DHEBAFJICG
  • DBHEAFCJIG
  • DBHEAFJICC
  1. 表达式的后缀表达式 9 3 1 - 3 * + 10 2 / + 的值为( ) {{ select(15) }}
  • 45
  • 19
  • 20
  • 51

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

(一)普通幂取模

#include<bits/stdc++.h>
using namespace std;
long long normalPower (long long base, long long power) {
    long long result=1;
    for (int i=1;i<=power;i++){
        result=result*base;
        result=result%1000;
    }
    return result%1000;
}
int main(){
    long long m,n;
    while (true){
        cin>>m>>n;
        if(m==0 && n==0) break;
        cout<<normalPower(m, n)<<endl;
    }
    return 0;
}

判断题 16. 输出的结果为三位数。( ) {{ select(16) }}

  • 正确
  • 错误
  1. 将第05行的<=改为<则输出结果不变。( ) {{ select(17) }}
  • 正确
  • 错误
  1. 将第13行true改为1,程序运行结果不会改变。( ) {{ select(18) }}
  • 正确
  • 错误
  1. 将第15行删除,程序运行结果不会改变。( ) {{ select(19) }}
  • 正确
  • 错误

选择题 20. 如果输入2和12,则输出结果为多少( ) {{ select(20) }}

  • 4
  • 96
  • 096
  • 4096
  1. (4分)这个算法的时间复杂度为( ) {{ select(21) }}
  • O(m*n)
  • O(n)
  • O(m)
  • O(m^n)

(二)约瑟夫环模拟

#include<bits/stdc++.h>
using namespace std;
const int N=1100;
int n,k,m;
int vis[N];
int main()
{
    cin>>n>>k>>m;
    int cnt=0;
    int num=0;
    while (cnt<n-1)
    {
        int cnt2=1;
        while(cnt2<=n)
        {
            int pos=k+cnt2;
            if(pos>n)
            {
                pos = pos-n;
            }
            if(!vis[pos])
            {
                num++;
                if(num%m==0)
                {
                    cnt++;
                    vis[pos]=1;
                    if(cnt==n-1)
                        break;
                }
            }
            cnt2++;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(!vis[i])
        {
            cout<<i<<endl;
            break;
        }
    }
    return 0;
}

判断题 22. 上述代码中,将第29行==修改为>=,输出结果一定不变。( ) {{ select(22) }}

  • 正确
  • 错误
  1. 上述代码中,将第29、30行删除,输出结果也一定相同。( ) {{ select(23) }}
  • 正确
  • 错误
  1. 上述代码中,输入的k值可以大于n。( ) {{ select(24) }}
  • 正确
  • 错误
  1. 上述代码中,输入的m值可以很大。( ) {{ select(25) }}
  • 正确
  • 错误

选择题 26. 当输入为12 3 8,输出为( ) {{ select(26) }}

  • 1
  • 3
  • 8
  • 9
  1. (4分)上述代码中,利用数组模拟的是( ) {{ select(27) }}
  • 队列
  • 以上都不是

(三)二分查找

#include<bits/stdc++.h>
using namespace std;
int select_arr(int arr[],int len,int arr_value)
{
    int left=0;
    int right=len-1;
    while(left<=right)
    {
        int mid=(left+right)/2;
        int mid_value=arr[mid];
        if(mid_value==arr_value)
        {
            return mid;
        }
        else if (mid_value>arr_value)
        {
            right=mid-1;
        }
        else if (mid_value<arr_value)
        {
            left=mid+1;
        }
    }
    return -1;
}
int main()
{
    int arr[10]={ 1,3,5,7,9,10,16,46,88, 91 };
    int weizhi=select_arr(arr,10,16);
    cout<<weizhi;
    return 0;
}

判断题 28. 数组arr[]的值可以为负数。( ) {{ select(28) }}

  • 正确
  • 错误
  1. 若第31行代码为int arr[10]={1,3,7,5,9,10,16,46,88,91},输出结果是一样的。( ) {{ select(29) }}
  • 正确
  • 错误
  1. 数组数值越大,排序效率越低。( ) {{ select(30) }}
  • 正确
  • 错误
  1. 当数组数据量越大时,和顺序查找相比优势越明显。( ) {{ select(31) }}
  • 正确
  • 错误

选择题 32. (4分)程序输出结果为( ) {{ select(32) }}

  • 4
  • 5
  • 6
  • 7
  1. (4分)该程序的算法为( ) {{ select(33) }}
  • 顺序查找
  • 二分查找
  • 哈希查找
  • 分块查找

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

(一)一元三次方程求解

有形如 ax³+bx²+cx+d=0 这样的一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),约定存在三个不同实根,根的范围在-100至100之间,且根与根之差的绝对值≥1。要求由小到大依次输出这三个实根,精确到小数点后2位。

#include<bits/stdc++.h>
using namespace std;
double a,b,c,d;
double f(①) //返回一元三次方程的值
{
    return 1.0*a*pow(x, 3) + b*pow(x, 2) + c*pow(x, 1) + d;
}

double mid (double x, double y)
{
    double st=x, en=y, mid=(st+en)*1.0/2;
    while ((double)fabs(f(mid))>0.000001)
    {
        if(f(st)*f(mid)>0)
        {
            st= ② ;
        }else if(f(en)*f(mid)>0){
            en=mid;
        }
        mid=( ③ )*1.0/2;
    }
    return mid;
}

int main()
{
    cin>>a>>b>>c>>d;
    double x=-100, y=-100;
    int num=0;
    double c[3];
    while( ④ )
    {
        if(f(x)*f(y)>0)
        {
            y+=0.9;
        }else{
            c[num]= ⑤ ;
            num++;
            x=y;
        }
    }
    printf("%.2lf %.2lf %.2lf",c[0],c[1],c[2]);
    return 0;
}
  1. ①处应填( ) {{ select(34) }}
  • int x
  • float x
  • double x
  • long long x
  1. ②处应填( ) {{ select(35) }}
  • x
  • y
  • mid
  • en
  1. ③处应填( ) {{ select(36) }}
  • x+y
  • y
  • st+en
  • en
  1. ④处应填( ) {{ select(37) }}
  • num<1
  • num<2
  • num<3
  • num<4
  1. ⑤处应填( ) {{ select(38) }}
  • f(x)*f(y)
  • x
  • mid(x,y)
  • y

(二)Bellman-Ford 最短路

给定一个有n个顶点(1~n编号)、m条边的有向图,部分边权可能为负,保证没有负环。计算从1号点到其他点的最短路。

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int ff=0x3f3f3f3f;
long long a[20020];
struct node
{
    int u,v,w;
}mp[200002];
void dj ()
{
    a[1]=0;
    for(int i=2; ① ;i++)
    {
        int k=-1;
        for(int j=1; ② ;j++)
        {
            if(a[mp[j].u]+mp[j].w < a[mp[j].v])
            {
                a[mp[j].v]= ③ ;
                k=1;
            }
        }
        if( ④ )
            break;
    }
    for(int i=2;i<=n;i++) cout<< ⑤ <<endl;
}
int main()
{
    cin>>n>>m;
    memset(a, ff, sizeof(a));
    for(int i=1;i<=m;i++)
    {
        cin>>mp[i].u>>mp[i].v>>mp[i].w;
    }
    dj();
    return 0;
}
  1. ①处应填( ) {{ select(39) }}
  • i<n
  • i<=n
  • i<m
  • i<=m
  1. ②处应填( ) {{ select(40) }}
  • j<n
  • j<=n
  • j<m
  • j<=m
  1. ③处应填( ) {{ select(41) }}
  • a[mp[j].u] + mp[j].w
  • a[mp[j].v] + mp[j].w
  • a[mp[i].u] + mp[i].w
  • a[mp[i].v] + mp[i].w
  1. ④处应填( ) {{ select(42) }}
  • k==0
  • k==1
  • k==-1
  • k==2
  1. ⑤处应填( ) {{ select(43) }}
  • mp[i].v
  • a[i]
  • mp[i].u
  • mp[a[i]].u