近期备战蓝桥杯刷题部分总结


前言

近期本蒟蒻在备战第十四届蓝桥杯大赛江西省赛,在刷题中有所总结,想分享给大家

一、进制转换

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string st;
    cin >> st;
    cout << stoi(st, 0, 9);
    return 0;
}

使用string库里面的stoi函数,将字符转换为十进制的字符。

 使用示例

stoi(st, 0, 9); st 表示的是字符串,转换开始的位置,9表示由九进制转换为十进制

二、整数分解

题目:

将 3 分解成两个正整数的和,有两种分解方法,分别是 3 = 1 + 2 和 3 = 2 + 1。注意顺序不同算不同的方法。将 5 分解成三个正整数的和,有 6 种分解方法,它们是 1+1+3 = 1+2+2 = 1 + 3 + 1 = 2 + 1 + 2 = 2 + 2 + 1 = 3 + 1 + 1。请问,将 2021 分解成五个正整数的和,有多少种分解方法? 

我没有想到这道题目可以用dp来做,当然也是可以用组合数学来做,组合数学更简单。

首先我们来将用dp来做

        状态设计:dp[i][j]表示 i 分成 j 个正整数之和的方案数

        初始状态:dp[i][1] = 1

        转移方程:dp[i][j] = \sum_{1}^{i - 1}  dp[k][j - 1] 其中k 是比i小的数

        所求结果:dp[2021][5] 

 看到这你可能不太理解转移方程,其意思是当把i分成 j 个正整数之和时,其方案数等于 将 k (k比 i 小)分成 j - 1个正整数之和,还有一个正整数是 i - k,共j个正整数。

#include <iostream>
using namespace std;
long long dp[2022][6];
int main()
{
    for(int i = 1; i <= 2021; i++)
        dp[i][1] = 1;
    for(int j = 1; j <= 2021; j++)
        for(int k = 1; k < i; k++)
            dp[i][j] += dp[k][j - 1];
    cout << dp[2021][5];
    return 0;
}

其次我们来说组合数学,这个题目相当于在2020个空隙之间插四个隔板,将其分成5个区域

ok ! 结束!


总结

stoi()函数用于将n进制转换为十进制,注意是将字符串转换为字符串。

可用dp来解决组合数学中的隔板问题。

最后是我对算法的感受,从去年10月份加入acm实验室第一次接触编程和算法,我被算法的思维与逻辑深深地吸引住了,但是因为自己并不是一个聪明的人和实验室比赛拉的太多,导致我没有很多时间去巩固所学的知识,我觉得我的数据结构,c++语法学的不好。现在我退出了acm算法实验室,很幸运加入了它对面的计算机应用实验室,计算机应用实验室给了我更多的时间去自主学习,也让我有一个良好的学习环境,在接下来的时间我会好好的去巩固我的数据结构,当然也会保留算法实验室的习惯,经常去刷题,相信时间的沉淀和自己的努力能让我的数据结构学的越来越好,除了算法,我也会去学些其他技术,后面也会和大家分享。

也分享一句我很喜欢的话:我喜欢田野,但我蠢笨,只能种荒十年,换得一时春生。

我的分享到此结束!!!!感谢观看!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值