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

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

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

  1. 甲乙两位工人一起在工厂工作。甲的生产速度是每小时6个鼠标或2个键盘。乙的生产速度是每小时4个鼠标或4个键盘。在一天6小时的工作中,甲乙两人通过合理搭配,最多可以一起生产出()个键鼠套装。 {{ select(1) }}
  • 21
  • 24
  • 28
  • 27
  1. 百度公司是一家于2000年创立的互联网公司,其业务范围十分广泛。以下选项中,()不属于百度的业务范围。 {{ select(2) }}
  • 台式计算机
  • 地图
  • 搜索引擎
  • 移动应用
  1. 假如数列3,6,12,24...符合固定规律,那么它的下一项最可能是()。 {{ select(3) }}
  • 48
  • 96
  • 72
  • 27
  1. 在上网浏览时,可以注意到有些网址以http://开始,有一些则是https://。在这里,后者比前者多出的字母s是()的缩写。 {{ select(4) }}
  • Second
  • Secure
  • System
  • Speed
  1. 在一张桌子上放了一定数量的铅笔。甲和乙轮流拿走铅笔,每次可以拿1根或者2根,拿走最后一根铅笔的人获胜。假如甲先取,那么在铅笔总数为()根时乙将最终获胜。 {{ select(5) }}
  • 356
  • 525
  • 974
  • 无法判断
  1. 将四个数字1,3,5,7经过四则运算(即只使用加、减、乘、除和括号)后,可能得到的最大结果是()。 {{ select(6) }}
  • 140
  • 180
  • 120
  • 105
  1. 下列不属于计算机人工智能应用领域的是()。 {{ select(7) }}
  • 在线订票
  • 医疗诊断
  • 智能机器人
  • 机器翻译
  1. 从本质上讲,计算机病毒是一种()。 {{ select(8) }}
  • 细菌
  • 文本
  • 程序
  • 微生物
  1. 下列叙述中正确的是()。 {{ select(9) }}
  • 所谓算法就是计算方法
  • 程序可以作为算法的一种描述方法
  • 算法设计只需考虑得到计算结果
  • 算法设计可以忽略算法的运算时间
  1. 下列结构中为非线性结构的是()。 {{ select(10) }}
  • 向量
  • 二维表
  • 矩阵
  1. 在访问网站时,链接前显示的http://是一种()。 {{ select(11) }}
  • 数据类型
  • 顶级域名
  • 文件格式
  • 传输协议
  1. 一位农夫想用20米的铁栅栏围出一个四边形。无论他怎么尝试,这个四边形的面积最大都不会超过()。 {{ select(12) }}
  • 25 m²
  • 21 m²
  • 32 m²
  • 16 m²
  1. 一袋水果中有50个香蕉,30个葡萄和40个草莓。一个人每次从袋子中随机抽取一个水果。()次后,他手中肯定至少有10个相同种类的水果。 {{ select(13) }}
  • 12
  • 28
  • 13
  • 30
  1. 一位魔术师要将名为酥糖、布丁和曲奇的三只鸽子藏进A,B,C,D四个箱子里。每个箱子都足够大,可以同时放下三只鸽子。那么一共有多少种不同的藏法()。 {{ select(14) }}
  • 24
  • 64
  • 48
  • 120
  1. 两位同学在讨论关于全球变暖的问题。小青认为全球变暖是错误的,因为她冬天早上起床时依旧觉得很冷。小蓝则认为全球变暖是确实存在的,原因是过去几十年中地球的平均气温越来越高了。在两个人的讨论中,()。 {{ select(15) }}
  • 小青提出的是观点;小蓝提出的是事实
  • 小青小蓝提出的都是事实
  • 小青提出的都是事实;小蓝提出的是观点
  • 小青小蓝提出的都是观点

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

(一)GCD与LCM计数

#include<iostream>
#include<cstdio>
using namespace std;
int gcd(int a,int b)
{
    while (b!=0)
    {
        int r=a%b;
        a=b;
        b=r;
    }
    return a;
}
int main()
{
    int x0,y0,ans=0;
    cin>>x0>>y0;
    for(int p=x0;p<=y0;p++)
    {
        for(int q=x0;q<=y0;q++)
        {
            int g=gcd(p,q);
            int b=p*q/g;
            if(g==x0&&b==y0) ans++;
        }
    }
    cout<<ans<<endl;
}

判断题 16. int gcd(int a,int b)函数是求a,b的最小公倍数。() {{ select(16) }}

  • 正确
  • 错误
  1. x0为最大公约数,y0为最小公倍数。() {{ select(17) }}
  • 正确
  • 错误
  1. x0一定小于等于y0。() {{ select(18) }}
  • 正确
  • 错误
  1. 当x0,y0的数据范围在[2,1000000]时,该程序在极端数据情况下会超时。() {{ select(19) }}
  • 正确
  • 错误

选择题 20. 若输入为3 60,则输出为()。 {{ select(20) }}

  • 4
  • 6
  • 8
  • 16

(二)BFS最少操作次数

#include<iostream>
#include<queue>
#define MAXN 100010
using namespace std;
bool visit[MAXN];
int n,k;
int ans[MAXN];
bool judge (int x)
{
    bool flag=true;
    if(visit[x]) flag=false;
    if(x<0) flag=false;
    if(x>100000) flag=false;
    return flag;
}
void bfs(int x)
{
    queue<int> q;
    q.push(x);
    while(!q.empty())
    {
        int v=q.front();
        q.pop();
        visit[v]=true;
        if(v==k)
        {
            return;
        }
        else
        {
            for(int i=0;i<3;i++)
            {
                int w;
                switch(i)
                {
                    case 0:w=v-1;break;
                    case 1:w=v+1;break;
                    case 2:w=v*2;break;
                }
                if(judge(w))
                {
                    visit[w]=true;
                    ans[w]=ans[v]+1;
                    q.push(w);
                }
            }
        }
    }
}
int main()
{
    cin>>n>>k;
    ans[n]=0;
    bfs(n);
    cout<<ans[k];
    return 0;
}

判断题 21. 代码中使用的队列queue可以使用一维数组代替。() {{ select(21) }}

  • 正确
  • 错误
  1. 若n的值大于100000,则一定会出现溢出。() {{ select(22) }}
  • 正确
  • 错误
  1. 该程序中visit[]数组作为标记数组使用。() {{ select(23) }}
  • 正确
  • 错误

选择题 24. 若输入的数据为5 17,则输出为()。 {{ select(24) }}

  • 4
  • 6
  • 7
  • 8
  1. 该程序是利用()算法模板来完成的。 {{ select(25) }}
  • 深度优先搜索
  • 宽度优先搜索
  • 记忆化搜索
  • 迭代加深搜索

(三)数组洗牌

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int n,k,ii,i,j;
    int a[1010],b[1010];
    cin>>n>>k>>ii;
    for(i=1;i<=n;++i) a[i]=i;
    for(i=1;i<=k;++i){
        for(j=1;j<=n;++j)
            if(j%2==1) b[j]=a[(j+1)/2];
            else b[j]=a[n/2+j/2];
        for(j=1;j<=n;++j)
            a[j]=b[j];
    }
    cout<<a[ii];
    return 0;
}

判断题 26. 题目中的数组a[1010],b[1010]可以定义在主函数外面。() {{ select(26) }}

  • 正确
  • 错误
  1. 该程序的时间复杂度为O(n³)。() {{ select(27) }}
  • 正确
  • 错误

选择题 28. 若输入为6 2 5则输出为()。 {{ select(28) }}

  • 4
  • 2
  • 8
  • 1

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

(一)密码锁

密码锁上有5个数字拨盘。每个数字拨盘每次向上拨使数字增加1(9向上拨得到0),向下拨使数字减少1(0向下拨得到9)。拨盘上的数字组成一个5位数,只要变为素数就能开锁。求最少拨动次数对应的5位素数,多解时输出最大的数。

#include<bits/stdc++.h>
using namespace std;
int x,ma=1000;
int xx[10],yy[10],ans[10];
int prime (int x)
{
    int i;
    if(x<2) return 0;
    for(i=2;i*i<=x;++i)
        if(①) return 0;
    return 1;
}
void check(int y)
{
    int t=0,i,tot=0;
    memset (yy,0, sizeof (yy));
    while(y){
        yy[++t]=②;
        y/=10;
    }
    for(i=1;i<=5;++i)
        tot+=min(③, abs(10+xx[i]-yy[i]));
    if(tot<ma){
        ma=tot;
        for(i=1;i<=5;++i) ans[i]=yy[i];
    }
}
int main()
{
    int i,t=0;
    cin>>x;
    while(x){
        xx[++t]=x%10;
        ④;
    }
    for(i=99999;i>=0;--i){
        if(prime(i)==0) continue;
        ⑤;
    }
    for(i=5;i>=1;--i) cout<<ans[i];
    return 0;
}
  1. ①处应填写()。 {{ select(29) }}
  • x%i==0
  • x%i==1
  • x%i=1
  • x%i=0
  1. ②处应填写()。 {{ select(30) }}
  • y%100
  • y%10
  • y/10
  • y/100
  1. ③处应填写()。 {{ select(31) }}
  • abs(yy[i]-xx[i])
  • yy[i]-xx[i]
  • max(yy[i]-xx[i])
  • min(yy[i]-xx[i])
  1. ④处应填写()。 {{ select(32) }}
  • x /=10
  • x%=10
  • x%==10
  • x /=100
  1. ⑤处应填写()。 {{ select(33) }}
  • check(i*i)
  • check(i)
  • Check(i)
  • check(i>>2)

(二)字符串最小替换代价

每次可以替换一个字符(代价1)或交换两个字符(代价0),求将第一个字符串变为第二个的最小代价。字符串由给定种子按规则生成。

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int i,n,s,minn,ans=0;
    int a[200]={0},b[200]={0};
    ①;
    for(i=1;i<=n;++i){
        s=②;
        ③;
    }
    for(i=1;i<=n;++i){
        s=(s*345)%19997;
        b['a'+s%26]++;
    }
    for(i=④;i<='z';++i){
        minn=⑤;
        ans+=a[i]-minn;
    }
    cout<<ans<<endl;
    return 0;
}
  1. ①处填写()。 {{ select(34) }}
  • cin>>n>>s
  • cin>>s>>n
  • cin<<n<<s
  • cin<<s<<n
  1. ②处填写()。 {{ select(35) }}
  • (s *345)%26
  • (s * 345)%19997
  • (s*345)%1997
  • (s*345)/1997
  1. ③处填写()。 {{ select(36) }}
  • a['a'+s%1997]++
  • a['a'+s%26]++
  • a['a'+s%26]--
  • --a['a'+s%26]
  1. ④处填写()。 {{ select(37) }}
  • 'a'
  • 'b'
  • 'A'
  • 'Z'
  1. ⑤处填写()。 {{ select(38) }}
  • min(a[i],b[i])
  • max(a[i],b[i])
  • abs(a[i],b[i])
  • (a[i],b[i])