蓝桥杯第二次训练赛题解

本文详细解析了蓝桥杯第二次训练赛的A至G七道题目,涉及斐波那契数列、深度优先搜索、绳子分割等算法问题,通过递推公式和动态规划求解,并提供了每道题目的代码实现。
摘要由CSDN通过智能技术生成

蓝桥杯第二次训练赛题解

A题

在这里插入图片描述

题解

计算斐波那契数列的值,n最大为45所以不用高精度直接用long long肯定可以存下。

代码
#include <iostream>
#include<cstdio>
long long int a[50];
using namespace std;
int main() {
    int n;
    scanf("%d",&n);
    a[1]=1*1ll;//斐波那契数列中第一个第二个没法从前面推出所以先赋值。
    a[2]=2*1ll;
    for(int i=3;i<=n;i++)
    {
        a[i]=a[i-1]+a[i-2];
    }
    printf("%lld",a[n]);
}

B题

在这里插入图片描述

题解

每一次都面临要上几次台阶的问题,一共有三种选择。使用深度优先搜索来做这道题。每一个传递的参数n是还剩几个台阶,只有最后所有的台阶都走完了才能算一种方案。递归return的条件是n为0或者是负数的情况。

代码
#include <iostream>
#include<cstdio>
using namespace std;
int sum=0;
int dfs(int n)
{
    if(n==0)//剩余台阶数等于零的时候
    {
        sum++;//方案数自增一
        return 0;
    }
    else if(n>0)
    {
        dfs(n-1);
        dfs(n-2);
        dfs(n-3);
    }
    return 0;
}
int main() {
    int n;
    scanf("%d",&n);
    dfs(n);
    printf("%d",sum);
}

C题

这道题参考链接:C题骨牌铺方格题解

D题

在这里插入图片描述

题解

每一次将绳子分为三段这三段必须都是整数,选取中间的一段继续分割。一直分割小于等于2m,问这个绳子最长是多少。
反向思考给定一个绳子让操作数最多那么最短绳长为1m,然后最长绳长等于第二长的绳长或者只比第二长绳子多一。递推公式为: f f f( x x x)=max{ f f f( x x x-1)+ f f f( x x x-1)+1, f f f( x x x-1)+ f f f( x x x-1)+1+1},整理后得出 f f f( x x x)= f f f( x x x-1)+ f f f( x x x-1)+2.

代码
#include <iostream>
#include<cstdio>
using namespace std;
long long int a[50];
int main() {
    int n;
    scanf("%d",&n);
    a[0]=2;//递推开始
    for(int i=1;i<=n;i++)
    {
        a[i]=a[i-1]+a[i-1]+2;
    }
    printf("%lld",a[n]);
}

E题

在这里插入图片描述

题解

这题考虑的是最差情况,即每道题的正确答案都是最后一个选项,所以第 i i i题选 a i a_i ai次才能选到正确答案.所以每一次都需要 a i a_i ai-1次试错。而每一次试错都需要把前面的 i i i-1次正确答案重新选择一遍。所以递推公式为:
f i f_i fi= f i − 1 f_{i-1} fi1+ a i a_i ai+( a i a_i ai-1)*( i i i-1)
f i f_i fi表示第 i i i次选出正确答案的选题次数。

ans += a[i] + (a[i] - 1) * (i - 1)    //ans代表前i - 1道题的选择总数
代码
#include<iostream>
using namespace std;

long long a[110], ans = 0;

int main(){
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++)
        cin >> a[i];
    for(int i = 1; i <= n; i++)
        ans += a[i] + (a[i] - 1) * (i - 1);
    cout << ans;
    return 0;
}

F题

在这里插入图片描述

题解

对于每个格子,能走的路径只有下和右,所以 对于每个格子路径数为上和左路径数的和。但是由于有障碍所以有些点需要特判一下。dp [ i i i][ j j j]为到达( i i i, j j j)点的方案数,如果这个点是障碍点dp[ i i i][ j j j]=0,如果不是障碍点则满足如下方程:dp[ i i i][ j j j]=dp[ i i i-1][ j j j]+dp[ i i i][ j j j-1]

代码
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[1005][1005];
bool map[1005][1005];
int main() {
    int n,m;
    memset(map,true,sizeof(map));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        map[x][y]=false;
    }
    if(map[1][1]==true)
    dp[1][1]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(map[i][j]==true)
            {
                dp[i][j]=max((dp[i-1][j]+dp[i][j-1]),dp[i][j]);
                dp[i][j]=dp[i][j]%100003;
            }
        }
    }
    printf("%d",dp[n][n]);
}

G题

在这里插入图片描述

题解

这道题的题解点这里,绝对不是我懒的写的原因

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值