第一题
考虑只有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 longmap<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;
}