2025 -- 星航计划 --三月份 -- 基础算法 总结

第一题

考虑只有B和C怎么做,如果一段里有偶数个B肯定全修改为A,否则肯定是若干个A最后剩下一个B。

对于所有情况,先将所有的A修改成BB(因为可以修改回来,所以肯定不劣),便转化成了只有B和C。

第二题

不说了,上码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n;
    cin >> n; // 输入数组大小

    vector<int> A(n), B(n), C(n);
    for (int i = 0; i < n; ++i) cin >> A[i];
    for (int i = 0; i < n; ++i) cin >> B[i];
    for (int i = 0; i < n; ++i) cin >> C[i];

    // 对三个数组进行升序排序
    sort(A.begin(), A.end());
    sort(B.begin(), B.end());
    sort(C.begin(), C.end());

    int i = 0, j = 0, k = 0; // 指针分别指向 A, B, C 的开头
    int count = 0;

    // 使用双指针解决问题
    while (i < n && j < n && k < n) {
        if (A[i] < B[j] && B[j] < C[k]) {
            // 如果满足 A[i] < B[j] < C[k],计数加1,三个指针全部前移
            ++count;
            ++i;
            ++j;
            ++k;
        } else if (A[i] >= B[j]) {
            // 如果 A[i] >= B[j],说明 B[j] 太小,j 前移
            ++j;
        } else {
            // 如果 B[j] >= C[k],说明 C[k] 太小,k 前移
            ++k;
        }
    }

    // 输出结果
    cout << count << endl;
    return 0;
}

第三题

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;

#define rep(i, n) for (int i = 0; i < (n); i++)

ll GCD(ll a, ll b) {
    return b ? GCD(b, a % b) : a;
}

ll LCM(ll a, ll b) {
    return a / GCD(a, b) * b;
}

int N;
ll s[2];
vector<ll> A, B;
vector<ll> D[2];

ll solve(ll x, ll y) {
    rep(i, N-1) {
        if (A[i] % x == 0 && B[i] % y == 0) continue;
        if (A[i] % y == 0 && B[i] % x == 0) continue;
        return 0;
    }
    return LCM(x, y);
}

int main() {
    cin >> N;
    A.resize(N-1);
    B.resize(N-1);
    rep(t, 2) cin >> s[t];
    rep(i, N-1) cin >> A[i] >> B[i];
    rep(t, 2) {
        for (ll d = 1; d * d <= s[t]; d++) {
            if (s[t] % d == 0) {
                D[t].push_back(d);
                if (d * d != s[t]) D[t].push_back(s[t] / d);
            }
        }
    }
    ll ans = 0;
    for (ll d0 : D[0]) {
        for (ll d1 : D[1]) {
            ans = max(ans, solve(d0, d1));
        }
    }
    cout << ans << "\n";
    return 0;
}

第四题

#include <map>
#include <cstdio>
using namespace std;
#define int long long

map<int, int> mp;
int T, n;

int solve(int n) {
    if (!n) return 0;
    if (mp[n]) return mp[n];
    int s = n / 10, r = n % 10;
    
    if (1 <= r && r <= 3 && solve(s) <= 1)
        return mp[n] = 1;
    if (2 <= r && r <= 6 && solve(s) <= 2)
        return mp[n] = 2;
    if (3 <= r && r <= 9 && solve(s) <= 3)
        return mp[n] = 3;
    if (4 <= r && r <= 9 && solve(s) <= 4)
        return mp[n] = 4;
    if (0 <= r && r <= 2 && solve(s - 1) <= 4)
        return mp[n] = 4;
    
    return mp[n] = 5;
}

signed main() {
    scanf("%lld", &T);
    while (T--) {
        scanf("%lld", &n);
        printf("%lld\n", solve(n));
    }
    return 0;
}

posted @ 2025-03-10 22:57  amcplayer  阅读(38)  评论(0)    收藏  举报