2019年蓝桥杯省赛真题题解B组

A、数列求值

题目描述

给定数列1, 1, 1, 3, 5, 9, 17, …,从第4 项开始,每项都是前3 项的和。求
第20190324 项的最后4 位数字。

代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long int f1=1;
    long long int f2=1;
    long long int f3=1;
    long long int f=0;
    for(int i=4;i<=20190324;i++)
    {
        f=(f1+f2+f3)%10000;
        f1=f2;
        f2=f3;
        f3=f;
    }
    cout<<f;
    return 0;
}

B、完全二叉树的值

题目描述

给定一棵包含N 个节点的完全二叉树,树上每个节点都有一个权值,按从
上到下、从左到右的顺序依次是A1, A2, AN,如下图所示:



现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点
权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是1。

输入格式

第一行包含一个整数N。
第二行包含N 个整数A1, A2, AN
对于所有评测用例,1<=N<=100000, -100000<=Ai<=100000。

输出格式

输出一个整数代表答案。

输入样例 复制

7
1 6 5 4 3 2 1

输出样例 复制

2

代码:

#include <bits/stdc++.h>
using namespace std;
int a[100010];
#define INF 0x3f3f3f3f
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    long long int maxsum=-INF,sum=0;
    int k=0,pos=1;
    for(int i=1;;i++)
    {
        if(pow(2,i)>=n+1)
        {
            k=i;
            break;
        }
    }
    int ans=1,f=0;
    for(int i=1;i<=k;i++)
    {
        sum=0;
        for(int j=1;j<=pow(2,i-1);j++)
        {
            sum+=a[ans++];
            if(ans>n)
            {
                f=1;
                break;
            }
        }
        if(sum>maxsum)
        {
            maxsum=sum;
            pos=i;
        }
    }
    cout<<pos;
    return 0;
}

C、组队 

题目描述

作为篮球队教练,你需要从以下名单中选出1 号位至5 号位各一名球员,组成球队的首发阵容。
每位球员担任1号位至5号位时的评分如下表所示。请你计算首发阵容1号位至5号位的评分之和最大可能是多少?


该表格可以参考team.txt

解题思路:

这道题直接看图就可以做

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    cout<<97+99+99+97+98;
    return 0;
}

D、年号字串

题目描述

小明用字母A 对应数字1,B 对应2,以此类推,用Z 对应26。对于27以上的数字
小明用两位或更长位的字符串来对应,例如AA 对应27,AB 对应28,AZ 对应52,LQ 对应329。
请问2019 对应的字符串是什么?

解题思路:

这题我是用笔算的。2019%26=17,这个余数一定是最后一个字符,2019=(2*26+25)*26+17(就是一直对26取余),=2*26^2+25*26+17,所以2对应B,对应Y,17对应Q。结果就是BYQ

答案:BYQ

E、数的分解

题目描述

把2019分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?
注意交换3个整数的顺序被视为同一种方法,例如1000+1001+18 和1001+1000+18 被视为同一种。

解题思路:

这道题目之前我单独发过一次博客,是我上次参加蓝桥杯之前写的,现在我又写一遍,上次的进行了优化,这次的没有,由于是填空题,所以也就没必要费精力。

代码:

#include<bits/stdc++.h>
using namespace std;
bool panduan(int n)
{
    while(n)
    {
        if(n%10==2||n%10==4)
            return false;
        n/=10;
    }
    return true;
}
int main()
{
    int ans=0;
    for(int i=1;i<2019;i++)
    {
        if(!panduan(i))
            continue;
        for(int j=i+1;j<2019-a;j++)
        {
            int k=2019-i-j;
            if(k<=0)
                break;
            else if(k<=j)
                break;
            else if(panduan(j)&&panduan(k))
            {
                ans++;
            }

        }
    }
    cout<<ans;
    return 0;
}

F、特别数的和

题目描述

小明对数位中含有2、0、1、9 的数字很感兴趣(不包括前导0)
在1到40中这样的数包括1、2、9、10 至32、39 和40,共28 个,他们的和是574。
请问,在1到n 中,所有这样的数的和是多少?

输入格式

输入一个正整数n(1<=n<=10000)

输出格式

输出一行,包含一个整数,表示满足条件的数的和。

输入样例 复制

40

输出样例 复制

574

解题思路:

暴力求解

代码:

#include<bits/stdc++.h>
using namespace std;
bool panduan(int n)
{
    while(n)
    {
        if(n%10==2||n%10==0||n%10==1||n%10==9)
            return true;
        n/=10;
    }
    return false;
}
int main()
{
    int n;
    cin>>n;
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        if(panduan(i))
            sum+=i;
    }
    cout<<sum;
    return 0;
}

G、等差数列

题目描述

数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N 个整数。
现在给出这N 个整数,小明想知道包含这N 个整数的最短的等差数列有几项?

输入格式

输入的第一行包含一个整数N。
第二行包含N 个整数A1.A2,..., AN。(注意A1<=AN 并不一定是按等差数列中的顺序给出)
2<=N<=100000,0<=Ai<=10^9

输出格式

输出一个整数表示答案。

输入样例 复制

5
2 6 4 10 20

输出样例 复制

10

数据范围与提示

包含2、6、4、10、20 的最短的等差数列是2、4、6、8、10、12、14、16、18、20。

解题思路:

想求出最少的项,就必须保证求出最大的公差,对数列进行排序,我们知道,后面的每一项和第一项的差都是公差的最小公倍数,所以,我们求出它们之间的差值,然后求出这些差值中的最大公约数就可以。

代码:

#include<bits/stdc++.h>
using namespace std;
long long int a[100010];
#define INF 0x3f3f3f3f
long long int b[100010];
int main()
{
    int n;
    cin>>n;
    long long int minnum=INF;
    long long int maxnum=-INF;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        minnum=min(minnum,a[i]);
        maxnum=max(maxnum,a[i]);
    }
    sort(a+1,a+n+1);
    long long int maxy=INF;
    int k=1;
    for(int i=2;i<=n;i++)
    {
        b[k++]=a[i]-a[1];
    }
    int f=0;
    for(int i=2;i<k;i++)
    {
        if(b[i-1]==0||b[i]==0)
        {
            f=1;
            break;
        }
        maxy=min(maxy,__gcd(b[i],b[1]));
    }
    //cout<<maxy<<endl;
    int m;
    if(f)
    {
        m=n;
    }
    else
    m=(maxnum-minnum)/(maxy)+1;
    //else
    cout<<m;
    return 0;
}

H、后缀表达式

题目描述

给定N 个加号、M 个减号以及N + M + 1 个整数A1,A2,...,AN+M+1
小明想知道在所有由这N 个加号、M 个减号以及N + M +1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个?
请你输出这个最大的结果。
例如使用1 2 3 + -,则“2 3 + 1 -” 这个后缀表达式结果是4,是最大的。

输入格式

第一行包含两个整数N 和M。
第二行包含N + M + 1 个整数A1,A2,...,AN+M+1
0<=N,M<=100000,-10^9<=Ai<=10^9

输出格式

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

输入样例 复制

1 1
1 2 3

输出样例 复制

4

 解题思路:

如果没有负号,那么就是直接将所有的数相加即可;

若既有负号又有正号,那么必然会有最大的数-最小的数,然后其余的数直接用绝对值相加;

代码:

#include<bits/stdc++.h>
using namespace std;
long long int b[200100];
int cmp(int a,int b)
{
    return a>b;
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n+m+1;i++)
    {
        long long int x;
        cin>>x;
        b[i]=x;
    }
    long long int sum=0;
    if(!m)
    {
        for(int i=1;i<=n+m+1;i++)
            sum+=b[i];
        cout<<sum;
        return 0;
    }
    sort(b+1,b+n+m+2,cmp);
    sum+=b[1];
    sum-=b[n+m+1];
    for(int i=2;i<n+m+1;i++)
        sum+=abs(b[i]);
    cout<<sum;
    return 0;
}

最后一道编程题看到题目就果断放弃了,还有一个填空题迷宫,没写,迷宫后期会补上。 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小阿丁呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值