A.小紅的好數
題意:
滿足數位為2, 且個位數和十位數相等
思路:
透過輸入字串, 首先判斷字串的個數是否為2, 在判斷個位數和十位數是否相等
複雜度:
O(1)
Code:
#include <bits/stdc++.h> using namespace std; using i64 = int64_t; void solve() { string s; cin >> s; if (s[0] == s[1] && s.size() == 2) { cout << "Yes\n"; } else { cout << "No\n"; } } int main() { cin.tie(0) -> sync_with_stdio(false); int t = 1; // cin >> t; while (t--) { solve(); } return 0; }
B.小紅的好陣列
題意:
找到區間為k長度的連續區間且不是迴文陣列但是可以修改一次得到迴文陣列, 計算當前滿足迴文陣列條件的個數
思路:
直接暴力列舉長度為k的連續區間, 判斷是否修改一次滿足是迴文陣列
複雜度:
O(n * k)
Code:
#include <bits/stdc++.h> using namespace std; using i64 = int64_t; void solve() { int n, k; cin >> n >> k; vector <int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } int ans = 0; for (int i = 0; i <= n - k; i++) { vector <int> b(a.begin() + i, a.begin() + i + k); int cnt = 0; for (int l = 0, r = k - 1; l < r; l ++, r --) { if (b[l] != b[r]) { cnt++; if (cnt > 1) { break; } } } if (cnt == 1) { ans++; } } cout << ans << '\n'; } int main() { cin.tie(0) -> sync_with_stdio(false); int t = 1; // cin >> t; while (t--) { solve(); } return 0; }
C.小紅的矩陣行走
題意:
從(0, 0)出發, 只能走下或右且每走一步都收集數字, 走到(n - 1, m - 1)且所有收集的數字都是相同的
思路:
一道基礎的板子題, 寫法很多
Code:
#include <bits/stdc++.h> using namespace std; using i64 = int64_t; constexpr int N = 1e2 + 5; int dirs[3] = {1, 0, 1}, n, m, a[N][N]; bool ok = 1; bool check (int x, int y) { return x >= 0 && x < n && y >= 0 && y < m; } void dfs (int x, int y) { if (x == n - 1 && y == m - 1) { ok = 0; return ; } for (int i = 0; i < 2; i++) { int dx = dirs[i] + x, dy = dirs[i + 1] + y; if (check(dx, dy) && a[dx][dy] == a[0][0]) { dfs(dx, dy); } } } void solve() { cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> a[i][j]; } } ok = 1; dfs(0, 0); cout << (!ok? "Yes" : "No") << '\n'; } int main() { cin.tie(0) -> sync_with_stdio(false); int t = 1; cin >> t; while (t--) { solve(); } return 0; } #include <bits/stdc++.h> using namespace std; using i64 = int64_t; constexpr int N = 1e2 + 5; int dirs[3] = {1, 0, 1}, a[N][N], n, m; bool check (int x, int y) { return x >= 0 && x < n && y >= 0 && y < n; } void solve() { cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> a[i][j]; } } queue <pair<int, int>> q; q.push({0, 0}); while (!q.empty()) { auto [x, y] = q.front(); q.pop(); if (x == n - 1 && y == m - 1) { cout << "Yes" << '\n'; return ; } for (int i = 0; i < 2; i++) { int dx = dirs[i] + x, dy = dirs[i + 1] + y; if (check(dx, dy) && a[dx][dy] == a[0][0]) { q.push({dx, dy}); } } } cout << "No" << '\n'; } int main() { cin.tie(0) -> sync_with_stdio(false); int t = 1; cin >> t; while (t--) { solve(); } return 0; } #include <bits/stdc++.h> using namespace std; using i64 = int64_t; constexpr int N = 1e2 + 5; int n, m, dp[N][N], a[N][N]; void solve() { cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> a[i][j]; dp[i][j] = 0; } } dp[1][1] = 1; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (i == 1 && j == 1) continue; if (a[i][j] != a[1][1]) continue; dp[i][j] = (i > 1 ? dp[i - 1][j] : 0) || (j > 1 ? dp[i][j - 1] : 0); } } cout << (dp[n][m] ? "Yes" : "No") << '\n'; } int main() { cin.tie(0) -> sync_with_stdio(false); int t = 1; cin >> t; while (t--) { solve(); } return 0; }
D:小紅的行列式構造
題意:
構造一個3階行列式, 滿足每個元素的絕對值不小於1, 且最後的值等於x
思路:
[a, b, c] [d, e, f] [g, h, i] -> a * e * i + b * f * g + c * d * h - a * f * h - b * d * i - c * e * g -> a * (e * i - f * h) + b * (f * g - d * i) + c * (d * h - e * g) 假設 a, b, c都是相同的, 那麼我們令它們為1 -> 1 * (e * i - f * h) + 1 * (f * g - d * i) + 1 * (d * h - e * g) -> d * (h - i) + e * (g - i) + f * (g - h) 如果假設d, e, f都是相同導致最終的結果為0, 也就是得到一個結論 如果a, b, c相同且d, e, f相同最終結果一定為0 那麼我們只能在d, e, f挑不是相同, 那麼e, f 為1, d為2, 透過計算式子可以得到 -> 2 * (h - i) + 1 * (g - i) + 1 * (g - h) -> 2 * (h - i) + g - i - g + h - i -> 2 * (h - i) + 0 h - i = x 那麼只要滿足這個式子都可以, 那麼我可以假設i = 101那麼我的h就是x + 101 為什麼不能是x + (值 < 101) 是因為行列式的值的絕對值需要大於等於x也就因為這, 最小情況只能是[g, x + 101 x] 其次發現g在這個式子是直接被約掉的, 那麼abs(g) >= 1的值都可以 那麼這題就順利解決了
Code:
#include <bits/stdc++.h> using namespace std; using i64 = int64_t; void solve() { int x; cin >> x; if (x == 0) { cout << "1 1 1\n1 1 1\n1 1 1\n"; } else { cout << "1 1 1\n2 1 1\n" << 2 << ' ' << x * 2 << ' ' << x << '\n'; } } int main() { cin.tie(0) -> sync_with_stdio(false); int t = 1; // cin >> t; while (t--) { solve(); } return 0; }
2