前言

最近一直窝在家里,已经快躺的四肢退化了,为了找点事干,也为了能够恢复一下做题的手感,所以决定做做题。

2020 蓝桥杯大学 B 组省赛模拟赛(一)

A. 结果填空:有趣的数字

我们称一个数是质数,而且数位中出现了 5 的数字是有趣的。例如 5,59,457 都是有趣的,而 15,7 不是。求 1 到 100000 中有趣的数的个数。

首先我们拆分问题,一种要求的“质数”,一种要求是“数位中出现了 5”,范围是“1 - 100000”。

所以代码如下:


#include <stdio.h>
typedef long long ll;   //将 ll 定义为 long long
#define N 100005

ll prime[N];            //数字里面存储的是质数
ll judge[N] = {1, 1};   //基本判断下表i不是质数的标为 1
ll num_prime=0;           //质数个数
//把质数做标记
void init()
{
    for (ll i = 2; i < N; ++i)
    {
        if (!judge[i])
            prime[num_prime++] = i;
        for (ll j = 0; j < num_prime && i * prime[j] < N; ++j)
        {
            judge[i * prime[j]] = 1; //把i的与比i小的质数乘积标记为不是质数
            if (!i % prime[j])
                break; //判断是不是到i这位质数
        }
    }
}
//函数实现判断位数有没有五存在
ll judge_dig(ll n)
{
    while (n)
    {
        if (n % 10 == 5)
            return 1;
        n /= 10;
    }
    return 0;
}
int main()
{
    ll cnt = 0;
    init();
    for (ll i = 1; i <= 100000; ++i)
        if (!judge[i] && judge_dig(i))
            ++cnt; //统计位数有5的质数的总个数
    printf("%lld\n", cnt);
    return 0;
}

B. 结果填空:爬楼梯

蒜头君要爬楼梯。楼梯一共有 10 层台阶。因为腿长的限制,每次最多能上 4 层台阶。但是第 5,7 层楼梯坏掉了不能踩。求上楼梯的方案数。

这个题的解题思路很简单,就是 DFS,长度为 10,每次移动范围为 1 - 4,其中把 5,7 去除,进行运算。

所以代码如下:

#include<stdio.h>
typedef long long ll;   //将 ll 定义为 long long
ll num=0;
void dfs(ll x)
{
    if(x == 5 || x == 7 || x > 10)
        return 0;
    if(x == 10){
        num++;
        return 0;
    }
    for(ll i=1; i<=4; i++)
        dfs(x+i);
}
int main()
{
    dfs(0);
    printf("%lld\n", num);
    return 0;
}

C. 结果填空:七巧板

求问在以下图案的大三角形内部添加五条直线最多可以将大三角形分成多少个区域。

例如下图一共有 77 个区域。

请在下图的基础上添加五条直线。

七巧板

这个题目,说实话当时并没有分析出来,但是从网上获取了方法:2020 蓝桥杯大学 B 组省赛模拟赛(一) C. 结果填空:七巧板

文章中提到了一个规律:

规律:f(n)=f(n-1)+n

公式:f(n)=n*(n+1)/2+1

结论是:下一次直线穿过的区域比上一次穿过的区域多1

具体分析可以上原博查看,附上我的代码:

#include<stdio.h>

int rec(int n)
{
  if(n==1)
        return 6;
  else
     return rec(n-1)+1;
}

int main()
{
  int num=7;
  for(int i=1;i<=5;i++)
     num+=rec(i);
  printf("%d\n",num);
  return 0;
}

D. 结果填空:苹果

有 30 个篮子,每个篮子里有若干个苹果,篮子里的苹果数序列已经给出。

现在要把苹果分给小朋友们,每个小朋友要么从一个篮子里拿三个苹果,要么从相邻的三个篮子里各拿一个苹果。

苹果可以剩余,而且不同的拿法会导致不同的答案。比如对于序列 3 1 3 ,可以分给两个小朋友变成 0 1 0;也可以分给一个小朋友变成 2 0 2,此时不能继续再分了。所以答案是 2 。

求问对于以下序列,最多分给几个小朋友?

7 2 12 5 9 9 8 10 7 10 5 4 5 8 4 4 10 11 3 8 7 8 3 2 1 6 3 9 7 1

本题的思路很好理解,就是贪心算法,首先设每个孩子每次都拿 3 个(取到不能拿出 3 个为止),所以剩下的只能是 0,1,2,为了取得最优解,此时每次都从相邻的三个不为零的篮子中各取一个。

所以代码如下:

#include<stdio.h>

int main()
{
     int basket[30],num=0;
     for(int i=0;i<30;i++)
        scanf("%d",&basket[i]);
     for(int i=0;i<30;i++)
      {
        num+=basket[i]/3;
        basket[i]%=3;
        while(basket[i]>0 && basket[i+1]>0 && basket[i+2]>0)
        {
            basket[i]--;
            basket[i+1]--;
            basket[i+2]--;
            num++;
        }
      }
     printf("%d",num);
     return 0;
}
Last modification:February 8th, 2020 at 01:02 pm
如果觉得我的文章对你有用,请随意赞赏