admin管理员组

文章数量:1027619

【今日三题】爱吃素(数学) / 相差不超过k的最多数(滑动窗口) / 最长公共子序列(一)(两个数组的dp)

爱吃素(数学)

  • 爱吃素

这题不能直接判断 a乘以b,因为根据题目给的数据范围可能溢出,所以需要找到其特点。 如果a和b都是大于1的数,那它们相乘得到的数一定不是素数,因为根据素数的定义其只能被自身和1整除,因此 a乘以b 是素数只能是:a == 1且b是素数;或者b==1且a是素数。

代码语言:javascript代码运行次数:0运行复制
#include <iostream>
#include <cmath>
using namespace std;

using ll = long long;

bool isprime(ll n)
{
    if (n < 2) return false;
    for (int i = 2; i <= sqrt(n); i++)
    {
        if (n % i == 0) return false;
    }
    return true;
}

int main()
{
    ll t, a, b;
    cin >> t;
    while (t--)
    {
        cin >> a >> b;
        if (a == 1 && isprime(b) || b == 1 && isprime(a)) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}

相差不超过k的最多数(滑动窗口)

  • 相差不超过k的最多数
代码语言:javascript代码运行次数:0运行复制
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 2e5 + 1;
int n, k, res;
int arr[N];

int main()
{
    cin >> n >> k;
    for (int i = 0; i < n; i++) cin >> arr[i];
    sort(arr, arr + n);
    for (int l = 0, r = 0; r < n; r++)
    {
        while (arr[r] - arr[l] > k)
        {
            l++;
        }
        res = max(res, r - l + 1);
    }
    cout << res << endl;
    return 0;
}

最长公共子序列(一)(两个数组的dp)

  • 最长公共子序列(一)

dp[i][j] 表示s1中 [0, i] 区间内和s2中 [0, j] 区间内的最长公共子序列的长度。

代码语言:javascript代码运行次数:0运行复制
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int n, m;
string s1, s2;

int main()
{
    cin >> n >> m;
    cin >> s1 >> s2;
    s1 = " " + s1;
    s2 = " " + s2;
    vector<vector<int>> dp(n + 1, vector<int>(m + 1));
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            if (s1[i] == s2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;
            else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
        }
    }
    cout << dp[n][m] << endl;
    return 0;
}

本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-05-03,如有侵权请联系 cloudcommunity@tencent 删除dpint数据数学数组

【今日三题】爱吃素(数学) / 相差不超过k的最多数(滑动窗口) / 最长公共子序列(一)(两个数组的dp)

爱吃素(数学)

  • 爱吃素

这题不能直接判断 a乘以b,因为根据题目给的数据范围可能溢出,所以需要找到其特点。 如果a和b都是大于1的数,那它们相乘得到的数一定不是素数,因为根据素数的定义其只能被自身和1整除,因此 a乘以b 是素数只能是:a == 1且b是素数;或者b==1且a是素数。

代码语言:javascript代码运行次数:0运行复制
#include <iostream>
#include <cmath>
using namespace std;

using ll = long long;

bool isprime(ll n)
{
    if (n < 2) return false;
    for (int i = 2; i <= sqrt(n); i++)
    {
        if (n % i == 0) return false;
    }
    return true;
}

int main()
{
    ll t, a, b;
    cin >> t;
    while (t--)
    {
        cin >> a >> b;
        if (a == 1 && isprime(b) || b == 1 && isprime(a)) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}

相差不超过k的最多数(滑动窗口)

  • 相差不超过k的最多数
代码语言:javascript代码运行次数:0运行复制
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 2e5 + 1;
int n, k, res;
int arr[N];

int main()
{
    cin >> n >> k;
    for (int i = 0; i < n; i++) cin >> arr[i];
    sort(arr, arr + n);
    for (int l = 0, r = 0; r < n; r++)
    {
        while (arr[r] - arr[l] > k)
        {
            l++;
        }
        res = max(res, r - l + 1);
    }
    cout << res << endl;
    return 0;
}

最长公共子序列(一)(两个数组的dp)

  • 最长公共子序列(一)

dp[i][j] 表示s1中 [0, i] 区间内和s2中 [0, j] 区间内的最长公共子序列的长度。

代码语言:javascript代码运行次数:0运行复制
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int n, m;
string s1, s2;

int main()
{
    cin >> n >> m;
    cin >> s1 >> s2;
    s1 = " " + s1;
    s2 = " " + s2;
    vector<vector<int>> dp(n + 1, vector<int>(m + 1));
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            if (s1[i] == s2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;
            else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
        }
    }
    cout << dp[n][m] << endl;
    return 0;
}

本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-05-03,如有侵权请联系 cloudcommunity@tencent 删除dpint数据数学数组

本文标签: 今日三题爱吃素(数学)相差不超过k的最多数(滑动窗口)最长公共子序列(一)(两个数组的dp)