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;
}


浙公网安备 33010602011771号