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

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

【传送门】
第六届蓝桥杯大赛个人赛省赛(软件类) C/C++大学B组
第十届蓝桥杯大赛软件类省赛C/C++大学B组
第十一届蓝桥杯大赛软件类省赛第二场C/C++大学B组
第十二届蓝桥杯大赛模拟赛(第四期)
第七届蓝桥杯大赛个人赛省赛(软件类) C/C++大学B组
蓝桥杯基础试题整合C++

一些自己的思路,欢迎指出问题一同讨论

  1. 求质数个数
  2. ASCII码转化
  3. 二叉树结点
  4. Fibonacci序列
  5. 身份证的最后一位
  6. 商店买文具
  7. 变换后的单词
  8. 递增三元组
  9. 特殊的栈
  10. 公共子序列

问题描述
  请问在 1900 到 2020 中,有多少个质数。
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案 16

#include <iostream>
#include <math.h>
using namespace std;
bool fun(int n){//求质数
    int k=sqrt(n);
    for(int i=2;i<k;i++){
        if(n%i==0){
            return false;
        }
    }
    return true;
}
int main()
{
    int sum=0;
    for(int i=1900;i<=2020;i++){
        if(fun(i)){
            sum++;
        }
    }
    cout<<sum<<endl;
    return 0;
}

问题描述
  ASCII 码将每个字符对应到一个数值(编码),用于信息的表示和传输。在 ASCII 码中,英文字母是按从小到大的顺序依次编码的,例如:字母 A 编码是 65, 字母 B 编码是 66,字母 C 编码是 67,请编码为 80 的是哪个字母?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个英文字母,在提交答案时只填写这个英文字母,填写多余的内容将无法得分。

答案 P

#include <iostream>
using namespace std;
int main()
{
    char zf;
    int n=80;
    zf=n;
    cout<<zf<<endl;
    return 0;
}

问题描述
  有一棵二叉树,有2021个叶结点。
  请问:这棵树至少有多少个结点?

> 答案提交 4041

N0=N2+1; 		
N=N0+N1+N2 
叶子结点就是度为0的结点 ,
这样我们就可以计算出度为2的节点数有2020个 
因为要求结点数最小,那么度为1的结点没有
所以至少有4041个结点

问题描述
  Fibonacci序列按照如下公式定义:
  F[1] = 1
  F[2] = 1
  F[i] = F[i-1] + F[i-2] (i>2)
  前几个 Fibonacci 数为 1, 1, 2, 3, 5, 8, 13, 21。
  请问,前100个 Fibonacci 数中,有多少个数是 3 的倍数?

答案 25

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int sum=0;
    long long int F[105];
    memset(F,0,sizeof(F));
    F[1]=1;
    F[2]=2;
    for(int i=3;i<=100;i++){
        F[i]=F[i-1]+F[i-2];
        if(F[i]%3==0){
            sum++;
        }
    }
    cout<<sum<<endl;
    return 0;
}

问题描述
  一个身份证号码有 18 位数字或字母组成。其中前17位必须是数字,最后一位可能是数字或字母X。
  身份证号码满足一定的校验规则。
  令身份证号从右到左依次标号为 1 到 18,其中标号为 i 的位的位权设置为 2^(i-1) mod 11 (2的i-1次方除以 11 的余数)。
  将每一位的数值乘以位权后相加,得到的结果除以 11 的余数应当为 1。其中最后一位(标号为1)中如果出现字母 X,看成数字 10。
  例如,如果一个人的身份证号为 34052419800101001X,则:
  标号为 1 的位,位权 1,数值 X,即 10,相乘得 10。
  标号为 2 的位,位权 2,数值 1,相乘得 10。
  标号为 3 的位,位权 4,数值 0,相乘得 0。
  标号为 4 的位,位权 8,数值 0,相乘得 0。
  标号为 5 的位,位权 5,数值 1,相乘得 5。
  标号为 6 的位,位权 10,数值 0,相乘得 0。
  标号为 7 的位,位权 9,数值 1,相乘得 9。
  标号为 8 的位,位权 7,数值 0,相乘得 0。
  标号为 9 的位,位权 3,数值 0,相乘得 0。
  标号为 10 的位,位权 6,数值 8,相乘得 48。
  标号为 11 的位,位权 1,数值 9,相乘得 9。
  标号为 12 的位,位权 2,数值 1,相乘得 2。
  标号为 13 的位,位权 4,数值 4,相乘得 16。
  标号为 14 的位,位权 8,数值 2,相乘得 16。
  标号为 15 的位,位权 5,数值 5,相乘得 25。
  标号为 16 的位,位权 10,数值 0,相乘得 0。
  标号为 17 的位,位权 9,数值 4,相乘得 36。
  标号为 18 的位,位权 7,数值 3,相乘得 21。
  将乘积相加,得 199,除以 11 的余数正好为 1。
  小明的身份证号前 17 位为 11010120210221999,请问小明身份证的最后一位是多少?

答案 8

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string id = "11010120210221999";
    int num[17]={2,4,8,5,10,9,7,3,6,1,2,4,8,5,10,9,7};
    int sum=0;
    int last;
    for(int i=0;i<17;i++){
        int idd=id[16-i]-'0';
        sum+=idd*num[i];
    }
    for(int i=0;i<=10;i++){
        if((sum+i)%11==1){
            last=i;
            break;
        }
    }
    cout<<last<<endl;//因为是填空题,如果last值为10就自动转化成‘x’就好了
    return 0;
}

问题描述
  小蓝在商店买文具。
  一支钢笔 x 元,小蓝买了 a 支。
  一个笔记本 y 元,小蓝买了 b 本。
  请问,小蓝一共需要支付多少钱?
输入格式
  输入四行。
  第一行包含一个整数 x。
  第二行包含一个整数 a。
  第三行包含一个整数 y。
  第四行包含一个整数 b。
输出格式
  输出一个整数,表示答案。
样例输入
5
2
1
6
样例输出
16
数据规模和约定
对于所有评测用例,0 <= x, a, y, b <= 100。

#include <iostream>
using namespace std;
int main()
{
    int x,a,y,b;
    cin>>x>>a>>y>>b;
    int sum=0;
    sum=x*a+y*b;
    cout<<sum<<endl;
    return 0;
}

问题描述
  给定一个单词,请将这个单词的首字母大写,后面的所有字母小写。
输入格式
  输入一行包含一个字符串,表示给定的单词。
输出格式
  输出变换后的单词。
样例输入
hello
样例输出
Hello
数据规模和约定
对于所有评测用例,单词的长度不超过 100,单词中只包含大小写英文字母。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string str;
    cin>>str;
    str[0]=toupper(str[0]);
    transform(str.begin()+1,str.end(),str.begin()+1,::tolower);
    cout<<str<<endl;
    return 0;
}

问题描述
  给定一个序列 (a_1, a_2, …, a_n), 定义序列中的一个递增三元组是指三个下标 i, j, k 对应的三个元素 a_i, a_j, a_k,这三个元素满足 a_i < a_j < a_k。
  例如序列 (1, 1, 4, 3, 2, 4) 有以下 4 个递增三元组:
  1. 下标 1, 4, 6 对应的 1, 3, 4;
  2. 下标 1, 5, 6 对应的 1, 2, 4;
  3. 下标 2, 4, 6 对应的 1, 3, 4;
  4. 下标 2, 5, 6 对应的 1, 2, 4。
  注意,可能有下标不同但对应数值相同的三元组,他们应当算成不同的三元组。
  给定序列,请问序列中一共有多少个不同的递增三元组。
输入格式
  输入第一行包含一个整数 n,表示序列的长度。
  第二行包含 n 个整数 a_1, a_2, …, a_n,表示给定的序列。
输出格式
  输出一行,包含一个整数,表示序列中的递增三元组数量。请注意答案可能很大,可能超过 32 位二进制整数的范围,建议使用 64 位二进制整数。
样例输入
6
1 1 4 3 2 4
样例输出
4
数据规模和约定
  对于 30% 的评测用例,1 <= n <= 20, 0 <= a_i <= 10。
  对于 50% 的评测用例,1 <= n <= 1000, 0 <= a_i <= 100。
  对于 80% 的评测用例,1 <= n <= 10000, 0 <= a_i <= 100。
  对于所有评测用例,1 <= n <= 100000, 0 <= a_i <= 100。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    int a[100005];
    int sum=0;
    memset(a,0,sizeof(a));
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if(a[j]>a[i]){
            for(int k=j+1;k<=n;k++){
                if(a[k]>a[j])
                sum++;
                }
            }
        }
    }
    cout<<sum<<endl;
    return 0;
}

问题描述
  小Hi正在研究一种特殊的栈。这种栈的元素既可以从栈顶出栈,也可以从栈底出栈。(进栈还是只能从栈顶进栈)
  已知入栈的序列是1~N的一个排列,请你判断出栈序列能否是1, 2, 3, … N?
输入格式
加粗样式  输入包含多组数据。
  输入第一行包含一个整数T,代表测试数据的组数。
  以下每组数据占据2行。
  第一行包含一个整数N。
  第二行包含N个整数,整数中由空格隔开。表示入栈序列。
输出格式
  对于每组数据输出YES或者NO,代表出栈序列能否是1, 2, 3, … N。
样例输入
2
5
2 4 1 3 5
5
4 3 1 5 2
样例输出
YES
NO
数据规模和约定
  对于30%的评测用例,1 <= N <= 10
  对于80%的评测用例,1 <= N <= 10000
  对于所有评测用例,1 <= N <= 100000, 1 <= T <= 10。

#include <bits/stdc++.h>
using namespace std;
vector<int> a;
int main()
{
    int b[100005];//存储出栈规律
    string TT[15];//存储数据是否可以按要求出栈
    memset(b,0,sizeof(b));
    int T,index;
    cin>>T;
    for(int i=0;i<T;i++){
        bool flag=true;
        int n;
        cin>>n;
        for(int k=0;k<n;k++){
            cin>>b[k];
            a.push_back(b[k]);
            if(b[k]==1){
                index=k;//记录最开始出栈的位置
            }
        }
        sort(b,b+n);//将b排序形成规定的出栈顺序
        a.erase(a.begin()+index);//首先出栈元素1
        for(int j=1;j<n;j++){//找第二个出栈的元素
            if(a[index]==b[j])//要么栈顶
            {
                a.erase(a.begin()+index);//找到下一个元素出栈
            }
            else if(a[0]==b[j]){//要么栈底
                a.erase(a.begin());//栈底出栈
                index--;//此时栈顶元素下移

            }
            else//如果不符合出栈要求返回false
            {
                flag=false;
                break;
            }
        }
        if(flag){
            TT[i]="YES";
        }
        else{
            TT[i]="NO";
        }
    }
    for(int i=0;i<T;i++){
        cout<<TT[i]<<endl;
    }
    return 0;
}

问题描述
  给定两个序列 A=(a_1, a_2, …, a_n) 和 B=(b_1, b_2, …, b_m), 它们的一个公共子序列是指从两个序列中分别取出相同个数的元素,按照原来的顺序排列后,对应位置的数值相等。
  例如,对于序列 A=(3, 2, 7, 6, 7) 和 B=(2, 3, 5, 7),可以在序列 A 中取出第 2, 3 个元素,在序列 B 中取出第 1, 4 个元素,值都是 2, 7,因此 2, 7 是一个公共子序列,在 A 中取第 2, 3 个元素和在 B 中取 1, 4 个元素是这个公共子序列的一种取法。
  在这两个序列中,有 4 中取法可以取出长度为 2 的公共子序列,例如
  1. 在 A 中取第 1, 3 个元素,在 B 中取 2, 4 个元素;
  1. 在 A 中取第 1, 5 个元素,在 B 中取 2, 4 个元素;
  1. 在 A 中取第 2, 3 个元素,在 B 中取 1, 4 个元素;
  1. 在 A 中取第 2, 5 个元素,在 B 中取 1, 4 个元素。
  给定两个序列,请问有多少种取法可以取出长度为 k 的公共子序列。
输入格式
  输入第一行包含三个整数 n, m, k,分别表示序列 A 的长度、序列 B 的长度和公共子序列的长度。
  第二行包含 n 个整数 a_1, a_2, …, a_n,表示给定的 A 序列。
  第三行包含 m 个整数 b_1, b_2, …, b_m,表示给定的 B 序列。
输出格式
  输出一行,包含一个整数,表示长度为 k 的公共子序列的数量,答案可能很大,请输出答案除以 1000007 的余数。
样例输入
5 4 2
3 2 7 6 7
2 3 5 7
样例输出
4
数据规模和约定
  对于 30% 的评测用例,1 <= n, m <= 20。
  对于 50% 的评测用例,1 <= n, m <= 100。
  对于所有评测用例,1 <= n, m <= 1000, 1 <= k <= 10, 0 <= a_i <= 100。

时间来不及了,我觉得我也写不出来,晚点康康
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值