2019年蓝桥杯省赛B组题解(A,B,C,D,F,G)

心得:菜是原罪,不仔细是罪上加罪!

A: 组队

每个人有五个分,别看成了一个人20个分…
答案 490

B: 年号字串

2019=2* 26* 26+25*26+17;

答案 BYQ

C: 数列求值

,1,1,1,3,5,9求20190324位

  #include
#include 
#include
#include
#include
#include
using namespace std;
typedef long long LL;
int a[3]={1,1,1};
int main()
{
    for(int i=4;i<=20190324;i++)
        a[i%3]=(a[0]+a[1]+a[2])%10000;
    printf("%d\n",a[20190324%3]);
	return 0;
}

D: 数的分解

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

#include
#include 
#include
#include
#include
#include
using namespace std;
typedef long long LL;
int main()
{
    int ans=0;
    for(int i=1;i<=694;i++)
    {
        if(i%10!=2 && (i/10)%10!=2 && (i/100)%10!=2 && i%10!=4 && (i/10)%10!=4 && (i/100)%10!=4)
        {
            for(int j=i+1;j<=1010;j++)
            {
                if(j%10!=2 && (j/10)%10!=2 && (j/100)%10!=2 &&  (j/1000)%10!=2 && j%10!=4 && (j/10)%10!=4 && (j/100)%10!=4 &&  (j/1000)%10!=4)
                {
                    for(int k=j+1;k<=2016;k++)
                    {
                        if(k%10!=2 && (k/10)%10!=2 && (k/100)%10!=2 &&  (k/1000)%10!=2 && k%10!=4 && (k/10)%10!=4 && (k/100)%10!=4 &&  (k/1000)%10!=4)
                        {
                            if( (i+j+k)==2019 )
                                ans++;
                        }

                    }
                }

            }
        }
    }
    printf("%d\n",ans);
	return 0;
}

F: 特别数的和

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

枚举暴力

#include
#include 
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
int a[100005];
int main()
{
    int n;
    LL ans=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        if(i%10==2  || (i/10)%10==2 || (i/100)%10==2 || (i/1000)%10==2)
            ans+=i;
        else if(i%10==1 || (i/10)%10==1 || (i/100)%10==1 || (i/1000)%10==1)
            ans+=i;
        else if(i%10==9 || (i/10)%10==9 || (i/100)%10==9 || (i/1000)%10==9)
            ans+=i;
        else if(i>=1 && i<10 && (i%10==0))
            ans+=i;
        else if(i>=10 && i<100 && (i%10==0 || (i/10)%10==0))
            ans+=i;
        else if(i>=100 && i<1000 && (i%10==0 || (i/10)%10==0 || (i/100)%10==0))
            ans+=i;
         else if(i>=1000 && i<=1000 && (i%10==0 || (i/10)%10==0 || (i/100)%10==0 || (i/1000)%10==0 || (i/10000)%10==0))
            ans+=i;
    }
    printf("%lld\n",ans);
    return 0;
}

G: 完全二叉树的权值

给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从
上到下、从左到右的顺序依次是 A 1 , A 2 , ··· A N ,
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点
权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。

深度一样就加,当为该深度最后一个的时候就考虑是否为最大权值。记录当前位置的下一个位置的深度用于判断。

  #include
#include 
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
int a[100005];
int main()
{
    int n,x,nx,ans,maxx=-100000000,num;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
    {
        x=log2(i)+1;
        nx=log2(i+1)+1;
        if(x==nx && i!=n)
            ans+=a[i];
        else if(i==n)
        {
            ans+=a[i];
            if(ans>maxx)
            {
                maxx=ans;
                num=x;
            }
        }
        else
        {
            ans+=a[i];
            if(ans>maxx)
            {
                maxx=ans;
                num=x;
            }
            ans=0;
        }
    }
    printf("%d\n",num);
    return 0;
}

你可能感兴趣的:(水题)