第十二届蓝桥杯大赛模拟赛(第三期)

目录

 

问题一

问题二

问题三

问题四

问题五

问题六

问题七

问题八

问题九

问题十

问题十一


问题一

问题描述

ASCII 码将每个字符对应到一个数值(编码),用于信息的表示和传输。在 ASCII 码中,英文字母是按从小到大的顺序依次编码的,例如:字母 A 编码是 65, 字母 B 编码是 66,字母 C 编码是 67,请问字母 Q 编码是多少?

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案:81

#include<iostream>
using namespace std;
int main()
{
    int a;
    char b;
    cin>>b;
    a=b;
    cout<<a;
    return 0;
}

问题二

问题描述

请问在 1 到 2020 中,有多少个数与 2020 互质,即有多少个数与 2020 的最大公约数为 1。

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案:800

//2020能被质数 2、5、101整除,遍历从1到2020有多少数是2,5,101的倍数,得到与2020不互为质数的数的个数,个数为1220,2020-1220=800
#include<iostream>
using namespace std;
int main()
{
    int a,b=0;
    for(int i=1;i<=2020;i++)
    {
        if(i%2==0||i%5==0||i%101==0)
        {
            b++;
        }
    }
    cout<<2020-b<<endl;
    return 0;
}

问题三

问题描述

有一棵二叉树,一个由 2021 个结点,其中有 1000 个结点有两个子结点, 其他的结点有一个或者 0 个子结点。请问,这棵二叉树有多少个叶结点?

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案:1001

当二叉树结点数为2021时,有2020条树枝,有两个子结点的结点数对应两个树枝,
有一个子结点的结点数对应一个树枝,那么当有2021个结点,有2020个树枝,其
中有1000个结点有两个子结点,就对应2000个树枝,还剩2020-2000 = 20个树
枝留给有一个子结点的结点数,就是2021-1000-20=1001个叶结点。
注:叶子节点个数等于度数为2的节点个数加1

问题四

问题描述

对于整数 v 和 p,定义 Pierce 序列为:

a[1] = v

a[i] = p % a[i-1]

例如,当 v = 8, p = 21 时,对应的 Pierce 序列为

a[1] = 8

a[2] = 5

a[3] = 1

再往后计算,值变为 0,不在我们考虑的范围内。因此当 v = 8, p = 21 时, Pierce 序列的长度为 3。

当 p 一定时,对于不同的 v 值,Pierce 序列的长度可能不同。当 p = 8时,若 1<=v<p,最长的 Pierce 序列出现在 v=13时,为(13, 8, 5, 1),长度为 4。

当 p=2021 时,最长的 Pierce 序列出现在 v=1160 时,请问这个序列有多长?

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案:12

#include<iostream>
using namespace std;
int main()
{
    int v=1160,p=2021,a=1;
    while(p%v!=0)
    {
        v=p%v;
        a++;
    }
    cout<<a<<endl;
    return 0;
}

问题五

问题描述

在 Excel 中,第 1 列到第 26 列的列名依次为 A 到 Z,从第 27 列开 始,列名有两个字母组成,第 27 列到第 702 列的列名依次为 AA 到 ZZ。

之后的列再用 3 个字母、4 个字母表示。

请问,第 2021 列的列名是什么?

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个有大写字母组成的字符串,在提交答案时只填写这个字符串,填写多余的内容将 无法得分。

答案:BYS

用2021除以26得到77余19,77除以26得到2余25
可以得到2、25、19,这些数字分别对应26个英文
字母的位置就是答案:BYS

//这道题是计算26进制
#include<iostream>
using namespace std;
int main()
{
    char a,b,c;
    int i,j,k;
    for(i=0;i<26;i++)
    {
        for(j=0;j<26;j++)
        {
            for(k=0;k<26;k++)
            {
                if(i*26*26+j*26+k==2021)
                {
                    a=i+64;//加上64是因为大写英文字母在ASCII码中从65开始
                    b=j+64;
                    c=k+64;
                    cout<<a<<b<<c;
                }
            }
        }
    }
}

问题六

问题描述

小蓝正在写一个网页显示一个新闻列表,他需要将总共 n 条新闻显示,每页最多可以显示 p 条,请问小蓝至少需要分多少页显示?

例如,如果要显示 2021 条新闻,每页最多显示 10 条,则至少要分 203 页显示。

输入格式

输入的第一行包含一个整数 n,表示要显示的新闻条数。

第二行包含一个整数 p,表示每页最多可以显示的条数。

输出格式

输出一个整数,表示答案。

样例输入

2021

10

样例输出

203

样例输入

2020

20

样例输出

101

数据规模和约定

对于所有评测用例,1 <= n <= 10000,1 <= p <= 100。

#include<iostream>
using namespace std;
int main()
{
    int a,b,c;
    cin>>a>>b;
    c=a/b;
    if(a%b==0)
    cout<<c;
    if(a%b!=0)
    cout<<c+1;
    return 0;
}

问题七

问题描述

在书写一个较大的整数时,为了方便看清数位,通常会在数位之间加上逗号来分割数位,具体的,从右向左,每三位分成一段,相邻的段之间加一个逗号。

例如,1234567 写成 1,234,567。

例如,17179869184 写成 17,179,869,184。

给定一个整数,请将这个整数增加分割符后输出。

输入格式

输入一行包含一个整数 v。

输出格式

输出增加分割符后的整数。

样例输入

1234567

样例输出

1,234,567

样例输入

17179869184

样例输出

17,179,869,184

数据规模和约定

对于 50% 的评测用例,0 <= v < 10^9 (10 的 9 次方)。

对于所有评测用例,0 <= v < 10^18 (10 的 18 次方)。

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s;
    cin>>s;
    for(int i=s.length()-3;i>0;i-=3)
    {
    s=s.substr(0,i)+","+s.substr(i);//substr()函数是复制函数
    }
    cout<<s;
}

问题八

问题描述

杂货铺老板一共有 N 件物品,每件物品具有 ABC 三种属性中的一种或多种。 从杂货铺老板处购得一件物品需要支付相应的代价。

现在你需要计算出如何购买物品,可以使得 ABC 三种属性中的每一种都在至少 一件购买的物品中出现,并且支付的总代价最小。

输入格式

输入第一行包含一个整数 N。

以下 N 行,每行包含一个整数 C 和一个只包含"ABC"的字符串,代表购得该物 品的代价和其具有的属性。

输出格式

输出一个整数,代表最小的代价。如果无论如何凑不齐 ABC 三种属性,输出-1。

样例输入

5

10 A

9 BC

11 CA

4 A

5 B

样例输出

13

数据规模和约定

对于 50%的评测用例,1 <= N <= 20

对于所有评测用例,1 <= N<= 1000, 1<=C<=100000

//本题是飞步无人驾驶2018届校园招聘在线笔试A轮,这道题没有写出来,代码是在网上找到的
 #include <bits/stdc++.h>
 using namespace std;
 int n;
 int a[10];
 int vis[3];
 int c;
 string s;
 int main(){
     scanf("%d",&n);
     memset(a,0x3f3f3f3f,sizeof(a));
     a[0] = 0;
     for (int i = 0;i < n;++i){
         scanf("%d",&c);
         cin >> s;
         memset(vis,0,sizeof(vis));
         int cnt = 0;
         for (int j = 0;j < s.length();j++){
             if (s[j] == 'A' && !vis[0]){
                 cnt++;
                 vis[0] = 1;
             }
             if (s[j] == 'B' && !vis[1]){
                 cnt += 2;
                 vis[1] = 1;
             }
             if (s[j] == 'C' && !vis[2]){
                 cnt += 4;
                 vis[2] = 1;
             }
         }
         a[cnt] = min(a[cnt],c);
     }
     int ans = 1e9+7;
     for (int i = 0;i < 6;++i){
         for (int j = 0;j < 7;++j){
             for (int k = j+1;k < 8;++k){
                 if (a[i] == 0x3f3f3f3f || a[j] == 0x3f3f3f3f || a[k] == 0x3f3f3f3f) continue;
                 if (((i&1) || (j&1) || (k&1)) && ((i&2) || (j&2) || (k&2)) && ((i&4) || (j&4) || (k&4))){
                    ans = min(ans,a[i] + a[j] + a[k]);
                 }
             }
         }
     }
     if (ans == 1e9+7){
         puts("-1");
     }else printf("%d\n",ans);
 }

问题九

问题描述

给定一个矩阵 M,由 n 行 m 列组成,第 i 行第 j 列值为 M[i][j]。

定义矩阵 M 的重量为矩阵中所有元素的和,几位 weight(M)

请找到矩阵左上角的一个子矩阵 S(矩阵的前 r 行中的前 c 列组成),使得 这个子矩阵的重量的两倍最接近矩阵 M 重量。即 |2 weight(S)-weight(M)| 最小。

如果有多个子矩阵满足条件,请找出面积 r * c 最小的一个。

如果仍然有多个子矩阵满足条件,请找出其中 r 最小的一个。

输入格式

输入第一行包含两个整数 n, m,表示矩阵的大小。

接下来 n 行,每行 m 个整数,表示给定的矩阵 M。

输出格式

输出一行,包含两个整数 r, c,表示子矩阵为矩阵 M 的前 r 行中的前 c 列。

样例输入

3 4

3 0 1

1 1 0

1 1 1

1 -2 4

样例输出

2 3

数据规模和约定

对于 30% 的评测用例,1 <= n, m <= 20, -10 <= M[i][j] <= 10。

对于 50% 的评测用例,1 <= n, m <= 100, -100 <= M[i][j] <= 100。

对于所有评测用例,1 <= n, m<= 1000, -1000 <= M[i][j] <= 1000。

1

问题十

问题描述

给定一个序列 (a_1, a_2, ..., a_n), 它的一个上升子序列是指从序列中取出一些元素,按照原来的顺序排列后,是单调递增的序列。

例如,对于序列 (3, 2, 7, 6, 7),取出下标为 2, 4, 5 的元素 a_2, a_4, a_5,即 2, 6, 7,是一个上升子序列。

在这个序列中,有 7 个长度为 2 的上升子序列,例如

1. 下标 1, 3 对应的 3, 7;

2. 下标 1, 4 对应的 3, 6;

3. 下标 1, 5 对应的 3, 7;

4. 下标 2, 3 对应的 2, 7;

5. 下标 2, 4 对应的 2, 6;

6. 下标 2, 5 对应的 2, 7;

7. 下标 4, 5 对应的 6, 7。

注意,可能有下标不同但对应数值相同的上升子序列,他们应当算成不同的上 升子序列。

给定序列,请问序列中一共有多少个长度为 k的上升子序列。

输入格式

输入第一行包含两个整数 n, k,表示序列的长度和上升子序列的长度。

第二行包含 n 个整数 a_1, a_2, ..., a_n,表示给定的序列。

输出格式

输出一行,包含一个整数,表示长度为 k 的上升子序列的数量,答案可能很大, 请输出答案除以 1000007 的余数。

样例输入

5 2

3 2 7 6 7

样例输出

7

数据规模和约定

对于 30% 的评测用例,1 <= n <= 20, 0 <= a_i <= 100。

对于 50% 的评测用例,1 <= n <= 100, 0 <= a_i <= 1000。

对于所有评测用例,1 <= n <= 1000, 1 <= k <= 10, 0 <= a_i <= 100

1

问题十一

问题描述

斐波那契数列是这样一个数列:它的第一项和第二项都是1,从第三项开始每一项都是前两项的和。

根据以上定义,我们容易计算出斐波那契数列的前几项依次是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ……

现在请你计算斐波那契数列第N项是奇数还是偶数?

输入格式

输入的包含一个整数N。

输出格

如果是奇数输出1,是偶数输出0。

样例输入

10

样例输出

1

提示

找规律。

数据规模和约定

对于所有评测用例,1 <= N <= 1000000000。

//斐波那契数列的数字规律是奇奇偶
#include<stdio.h>
int fun(int n)
{
    if(n==1||n==2)
        return 1;
    else
        return fun(n-1)+fun(n-2);
}
int main()
{
    int n;
    scanf("%d",&n);
    if(n%3==0)
    printf("0");
    else
    printf("1");
    return 0;
}

这些试题中第八题、第九题、第十题没有写出来,等写出来之后会补充。

如果在试题解答代码中有错误,希望大家能够指出来,非常感谢。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值