笔试练习day8

HJ108 求最小公倍数(简单)(数论)

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

描述

正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。

数据范围:1≤𝑎,𝑏≤100000 1≤a,b≤100000

输入描述:

输入两个正整数A和B。

输出描述:

输出A和B的最小公倍数。

示例1

输入:

5 7

复制

输出:

35

复制

示例2

输入:

2 4

复制

输出:

4

复制

#include <iostream>
using namespace std;

long long gcd(long long a,long long b)
{
    return b==0?a:gcd(b,a%b);
}

long long lcm(long long a,long long b)
{
    return a/gcd(a,b)*b;
}

int main() {
    long long a,b;
    cin>>a>>b;

    cout<<lcm(a,b);
}
// 64 位输出请用 printf("%lld")

NC95 数组中的最长连续子序列(简单)(滑动窗口,双指针)

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

描述

给定无序数组arr,返回其中最长的连续序列的长度(要求值连续,位置可以不连续,例如 3,4,5,6为连续的自然数)

数据范围: 1≤𝑛≤1051≤n≤105,数组中的值满足 1≤𝑣𝑎𝑙≤1081≤val≤108

要求:空间复杂度 𝑂(𝑛)O(n),时间复杂度 𝑂(𝑛𝑙𝑜𝑔𝑛)O(nlogn)

示例1

输入:

[100,4,200,1,3,2]

复制

返回值:

4

复制

示例2

输入:

[1,1,1]

复制

返回值:

1

复制

备注:

1≤𝑛≤1051≤n≤105
1≤𝑎𝑟𝑟𝑖≤1081≤arri≤108
int myhash[100000010];
class Solution {
public:
    
    int MLS(vector<int>& arr) {
        for(auto e:arr)
        {
            myhash[e]++;
        }
        int left=0,right=0;
        int ret=0;
        while(right<100000010)
        {
            if(myhash[right]>0) left=right;
            else 
            {
                right++;
                continue;
            }
            while(myhash[right]>0)
            {
                ret=max(ret,right-left+1);
                right++;
            }
        }
        return ret;
    }
};

字母收集(中等)(动态规划)

字母收集_牛客题霸_牛客网 (nowcoder.com)

描述

有一个 𝑛∗𝑚nm 的矩形方阵,每个格子上面写了一个小写字母。
小红站在矩形的左上角,她每次可以向右或者向下走,走到某个格子上就可以收集这个格子的字母。
小红非常喜欢 “love” 这四个字母。她拿到一个 l 字母可以得 4 分,拿到一个 o 字母可以得 3 分,拿到一个 v 字母可以得 2 分,拿到一个 e 字母可以得 1 分。
她想知道,在最优的选择一条路径的情况下,她最多能获取多少分?

输入描述:

1≤𝑛,𝑚≤5001≤n,m≤500
接下来的 𝑛n 行 每行一个长度为 𝑚m 的、仅有小写字母构成的字符串,代表矩形方阵。

输出描述:

小红最大可能的得分。

示例1

输入:

3 2
ab
cd
ef

复制

输出:

1

复制

说明:

选择下、下、右)这条路径即可,可以收集到 acef 这四个字母各一次,获得 0+0+1+0=1 分。  

示例2

输入:

2 3
lle
ove

复制

输出:

11
#include <iostream>
#include<vector>
#include<unordered_map>
using namespace std;
unordered_map<char,int> sec;
int main() {
    sec['l']=4;
    sec['o']=3;
    sec['v']=2;
    sec['e']=1;
    int n,m;
    cin>>n>>m;
    vector<vector<char>> arr(n+1,vector<char>(m+1,'a'));
    vector<vector<int>> dp(n+1,vector<int>(m+1));
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>arr[i][j];
        }
    }

    //dp[0][0]=sec[arr[0][0]-'a'];

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            dp[i][j]=max(dp[i][j-1],dp[i-1][j])+sec[arr[i][j]];
        }
    }
    cout<< dp[n][m];
}
// 64 位输出请用 printf("%lld")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值