【C++笔试强训】如何成为算法糕手Day8


学习编程就得循环渐进,扎实基础,勿在浮沙筑高台

循环渐进Forward-CSDN博客

目录

循环渐进Forward-CSDN博客

最小公倍数

思路:

代码实现:

普通解法

辗转相除法

数组中的最长连续子序列

思路:

代码实现:

字母收集

思路:

代码实现:

最小公倍数

牛客网做题链接:求最小公倍数_牛客题霸_牛客网 (nowcoder.com)

思路:

要找到两个正整数A和B的最小公倍数,我们可以采用一个公式,即两数之积除以它们的最大公约数。为了求得这个最大公约数,有多种方法可供选择,其中最为人所熟知的是穷举法和辗转相除法。在这里,我们主要关注并应用这两种方法:穷举法和辗转相除法,来求解A和B的最大公约数,进而求得它们的最小公倍数。

代码实现:

普通解法

复制代码
#include <iostream>
using namespace std;

int main()
{
    int a, b;
    cin >> a >> b;
    int min = a>b ? a : b;
    int ret = 0;
    for(int i = 1;i <= min;i++)
    {
        if(a%i == 0 && b%i == 0)
            ret = i;
    }
    cout << a*b/ret << endl;
    return 0;
}
辗转相除法

辗转相除法就是用a对b求余,若余数为0,则除数b为最大公约数。若余数不为0,将此余数r作为新的除数,b作为新的被除数,重新求余,直到余数为0为止。此时的最大公约数为除数

复制代码
#include <iostream>
using namespace std;

int gcd(int a,int b)
{
    if(b == 0)
        return a;
    return gcd(b,a%b);
}

int main() {
    int a, b;
    cin >> a >> b;
    cout << a*b/gcd(a,b) << endl;
    return 0;
}

数组中的最长连续子序列

牛客网做题链接:数组中的最长连续子序列_牛客题霸_牛客网 (nowcoder.com)

思路:

字符串中找出连续最长的数字串思路类似的计数。因为是无序数组所以先采用sort数组的排序,然后利用变量count记录更新长度,利用len保留最大长度并最后返回,然后遍历数组,当相邻的元素是连续的就更新count长度,如果相邻的数值相同则越过继续判断下一位元素即可,最后遍历结束返回最大值len,其中涉及一些细节处理。

代码实现:

复制代码
class Solution {
public:
    int MLS(vector<int>& arr)
    {
        sort(arr.begin(),arr.end());
        int len = arr.size();
        int j = 0;
        int countlen = 1;
        int maxcount = 0;
        for(int i = 0;i < len; i+=countlen)
        {
            j = i + 1;
            countlen = 1;
            while(j < len)
            {
                if(arr[j] - arr[j-1] == 1)
                {
                    countlen++;
                    j++;
                }
                else if(arr[j] - arr[j-1] == 0)
                {
                    j++;
                }
                else
                {
                    break;
                }
            }
            maxcount = max(maxcount , countlen);
        }
        return maxcount;
    }
};

字母收集

牛客网做题链接:字母收集_牛客题霸_牛客网 (nowcoder.com)

思路:

经典的二维动态规划问题,由题目规则很容易想到:

dpij表示:到第i行j列的最大分数和;

那么推导状态转移方程就是:dpij = 由左边dpij-1或上方dpi-1j,再加上其分数得到;

即: dpij = max(dpi - 1j, dpij - 1) + score

代码实现:

复制代码
#include <iostream>
using namespace std;

const int N = 501;
char ch[N][N];
int dp[N][N];

int main() {
    int n,m;
    cin >> n >> m;
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= m;j++)
        {
            cin >> ch[i][j];
        }
    }

    int score = 0;
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= m;j++)
        {
            if(ch[i][j] == 'l')
                score = 4;
            else if(ch[i][j] == 'o')
                score = 3;
            else if(ch[i][j] == 'v')
                score = 2;
            else if(ch[i][j] == 'e')
                score = 1;
            else
                score = 0;
            dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + score;
        }
    }
    cout << dp[n][m] << endl;
    return 0;
}

学习编程就得循环渐进,扎实基础,勿在浮沙筑高台


相关推荐
淡海水6 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
leobertlan7 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
Tisfy8 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
lvwangshu8 小时前
P7668 [JOI 2018 Final] 团子制作 / Dango Maker 题解
动态规划·题解·贪心·性质题·思维好题
乐迪信息8 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
kiracrimson9 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
木井巳10 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
心抵鹊10 小时前
归并排序之翻转对(hard)
数据结构·算法
白山编程大哥10 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
_Twink1e10 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen