A題
知識點:模擬
打卡。檢查給定的七個整數是否僅包含?1,2,3,5,6 即可。為了便于書寫,我們可以反過來,檢查這七個整數是否不為?4?和?7。?時間?O(1);空間?O(1)。
?
#include <bits/stdc++.h>
using namespace std;signed main() {bool flag = true;for (int i = 1; i <= 7; i++) {int x;cin >> x;if (x == 4 || x == 7) {flag = false;}}cout << (flag ? "YES" : "NO") << "\n";
}
B題
?
#include <bits/stdc++.h>
using namespace std;signed main() {int n;cin >> n;vector<int> in(n + 1);for (int i = 1; i <= n; i++) {cin >> in[i];}sort(in.begin(), in.end());cout << in[n / 2 + 1] - 1 << "\n";
}
G題
?
#include <bits/stdc++.h>
using namespace std;using i64 = long long;
const i64 inf = 1e18;signed main() {int Task = 1;for (cin >> Task; Task; Task--) {int n, m;cin >> n >> m;i64 Min = 1e18, ans, now = 1;for (int i = 1; i <= 32; i++) {if (now >= inf / m) break;now *= m;if (abs(n - now) < Min) {Min = abs(n - now);ans = i;}}cout << ans << '\n';}
}
F題
?
#include <bits/stdc++.h>
using namespace std;using i64 = long long;signed main() {int Task = 1;for (cin >> Task; Task; Task--) {i64 l, r;cin >> l >> r;cout << (r - l + 1) << "\n";}
}
?
J題
?
?
#include <bits/stdc++.h>
using namespace std;signed main() {int n, h, m;cin >> n >> h >> m;string Date = to_string(h) + "-";if (m < 10) {Date += "0" + to_string(m);}else {Date += to_string(m);}set<string> A, B, C;while (n--) {string user, date, time;cin >> user >> date >> time;if (date.substr(0, 7) != Date) {continue;}string h = time.substr(0, 2);if (h == "07" || h == "08" || time == "09:00:00" ||h == "18" || h == "19" || time == "20:00:00") {A.insert(user);}if (h == "11" || h == "12" || time == "13:00:00") {B.insert(user);}if (h == "22" || h == "23" || h == "00" || time == "01:00:00") {C.insert(user);}}cout << A.size() << " " << B.size() << " " << C.size() << "\n";
}
D題
?
?
#include <bits/stdc++.h>
using namespace std;signed main() {int n;string s;cin >> n >> s;s = "#" + s;int ans = 0;for (int ch = 0; ch < 26; ch++) {int pre = 0, net = 0;for (int i = 1; i <= n; i++) {if (s[i] - 'a' != ch) continue;if (pre != 0) {ans = max(ans, n - i + 1);}pre = i;}for (int i = n; i >= 1; i--) {if (s[i] - 'a' != ch) continue;if (net != 0) {ans = max(ans, i);}net = i;}}cout << (ans == 1 ? 0 : ans) << "\n";
}
代碼的核心思路是針對每個小寫字母,分別正向和反向遍歷字符串,找出該字母至少出現兩次時的最長連續子串長度,最后取所有字母對應的最長長度作為可愛度。不過要注意,此代碼實現與題目要求的可愛度定義可能存在差異,因為它僅考慮了單個字母的情況,而沒有對所有可能的子串和不連續子序列進行檢查。
例子 1
5
ababa
- 分析過程:
- 代碼開始遍歷每個小寫字母。當?
ch
?為?'a'
?時:- 正向遍歷:
- 第一次遇到?
'a'
?在位置?1
,此時?pre
?從?0
?變為?1
。 - 第二次遇到?
'a'
?在位置?3
,此時?pre
?不為?0
,計算?n - i + 1 = 5 - 3 + 1 = 3
,更新?ans
?為?3
。 - 第三次遇到?
'a'
?在位置?5
,計算?n - i + 1 = 5 - 5 + 1 = 1
,ans
?保持為?3
。
- 第一次遇到?
- 反向遍歷:
- 第一次遇到?
'a'
?在位置?5
,net
?從?0
?變為?5
。 - 第二次遇到?
'a'
?在位置?3
,此時?net
?不為?0
,計算?i = 3
,ans
?保持為?3
。 - 第三次遇到?
'a'
?在位置?1
,計算?i = 1
,ans
?保持為?3
。
- 第一次遇到?
- 正向遍歷:
- 當?
ch
?為?'b'
?時:- 正向遍歷:
- 第一次遇到?
'b'
?在位置?2
,pre
?從?0
?變為?2
。 - 第二次遇到?
'b'
?在位置?4
,此時?pre
?不為?0
,計算?n - i + 1 = 5 - 4 + 1 = 2
,ans
?保持為?3
。
- 第一次遇到?
- 反向遍歷:
- 第一次遇到?
'b'
?在位置?4
,net
?從?0
?變為?4
。 - 第二次遇到?
'b'
?在位置?2
,此時?net
?不為?0
,計算?i = 2
,ans
?保持為?3
。
- 第一次遇到?
- 正向遍歷:
- 最終?
ans
?為?3
,輸出結果為?3
。
- 代碼開始遍歷每個小寫字母。當?
例子 2
3
abc
- 分析過程:
- 當?
ch
?為?'a'
?時:- 正向遍歷:只在位置?
1
?遇到?'a'
,pre
?變為?1
,但由于只出現一次,不會更新?ans
。 - 反向遍歷:同理,也不會更新?
ans
。
- 正向遍歷:只在位置?
- 當?
ch
?為?'b'
?時:- 正向遍歷:只在位置?
2
?遇到?'b'
,不會更新?ans
。 - 反向遍歷:不會更新?
ans
。
- 正向遍歷:只在位置?
- 當?
ch
?為?'c'
?時:- 正向遍歷:只在位置?
3
?遇到?'c'
,不會更新?ans
。 - 反向遍歷:不會更新?
ans
。
- 正向遍歷:只在位置?
- 對于其他字母也都只出現一次。最終?
ans
?為?0
,輸出結果為?0
。
- 當?
例子 3
4
aaaa
- 分析過程:
- 當?
ch
?為?'a'
?時:- 正向遍歷:
- 第一次遇到?
'a'
?在位置?1
,pre
?變為?1
。 - 第二次遇到?
'a'
?在位置?2
,此時?pre
?不為?0
,計算?n - i + 1 = 4 - 2 + 1 = 3
,更新?ans
?為?3
。 - 第三次遇到?
'a'
?在位置?3
,計算?n - i + 1 = 4 - 3 + 1 = 2
,ans
?保持為?3
。 - 第四次遇到?
'a'
?在位置?4
,計算?n - i + 1 = 4 - 4 + 1 = 1
,ans
?保持為?3
。
- 第一次遇到?
- 反向遍歷:
- 第一次遇到?
'a'
?在位置?4
,net
?變為?4
。 - 第二次遇到?
'a'
?在位置?3
,此時?net
?不為?0
,計算?i = 3
,ans
?保持為?3
。 - 第三次遇到?
'a'
?在位置?2
,計算?i = 2
,ans
?保持為?3
。 - 第四次遇到?
'a'
?在位置?1
,計算?i = 1
,ans
?保持為?3
。
- 第一次遇到?
- 正向遍歷:
- 對于其他字母都未出現。最終?
ans
?為?3
,輸出結果為?3
。
- 當?
K題
?
#include <bits/stdc++.h>
using namespace std;
// 定義長整型別名,在某些涉及較大整數運算時可使用
#define i64 long long
// 定義上下左右四個方向在 x 軸上的偏移量
int dx[4] = {-1, 1, 0, 0};
// 定義上下左右四個方向在 y 軸上的偏移量
int dy[4] = {0, 0, -1, 1};// 解決問題的核心函數
void solve() {int n, m;// 讀取矩陣的行數 n 和列數 mcin >> n >> m;// 定義一個字符串向量 s 來存儲矩陣,索引從 1 開始,方便后續處理vector<string> s(n + 1);for (int i = 1; i <= n; i++) {// 讀取每一行的字符串cin >> s[i];// 在每行字符串前添加一個字符 '%',使得字符串索引從 1 開始s[i] = "%" + s[i];}// 用于存儲每個藍色極大連通塊對應的需要敲碎的灰色磚塊數量,初始大小為 m * n + 1vector<int> g(m * n + 1);// 記錄當前藍色極大連通塊的編號int idx = 0;// 二維布爾數組 v,用于標記矩陣中每個位置是否已被訪問過vector<vector<bool>> v(n + 1, vector<bool>(m + 1, false));// 二維數組 num,記錄每個藍色磚塊所屬的藍色極大連通塊編號vector<vector<int>> num(n + 1, vector<int>(m + 1, 0));// 定義一個遞歸的 lambda 函數 dfs,用于深度優先搜索藍色極大連通塊auto dfs = [&](auto &&self, int x, int y, int id) -> void {// 標記當前位置 (x, y) 的藍色磚塊屬于編號為 id 的連通塊num[x][y] = id;// 標記當前位置已被訪問v[x][y] = true;for (int i = 0; i < 4; i++) {// 計算相鄰位置的 x 坐標int nx = dx[i] + x;// 計算相鄰位置的 y 坐標int ny = dy[i] + y;// 檢查相鄰位置是否在矩陣范圍內、未被訪問且為藍色磚塊if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && !v[nx][ny] && s[nx][ny] == '1') {// 遞歸調用 dfs 函數繼續搜索相鄰的藍色磚塊self(self, nx, ny, id);}}};// 遍歷矩陣中的每個位置for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {// 如果當前位置未被訪問且為藍色磚塊if (!v[i][j] && s[i][j] == '1') {// 藍色極大連通塊編號加 1++idx;// 調用 dfs 函數開始搜索該連通塊dfs(dfs, i, j, idx);}}}// 再次遍歷矩陣,統計每個藍色極大連通塊周圍的灰色磚塊數量for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (s[i][j] == '0') {// 用于記錄當前灰色磚塊相鄰的不同藍色極大連通塊編號map<int, bool> ex;for (int k = 0; k < 4; k++) {// 計算相鄰位置的 x 坐標int nx = i + dx[k];// 計算相鄰位置的 y 坐標int ny = j + dy[k];// 檢查相鄰位置是否在矩陣范圍內、為藍色磚塊且該連通塊編號未被記錄過if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && s[nx][ny] == '1' && !ex[num[nx][ny]]) {// 對應連通塊的需要敲碎的灰色磚塊數量加 1g[num[nx][ny]]++;// 標記該連通塊編號已被記錄ex[num[nx][ny]] = true;}}}}}// 對存儲每個連通塊對應灰色磚塊數量的向量 g 進行排序,排序范圍是從索引 1 到 idxsort(g.begin() + 1, g.begin() + idx + 1);// 輸出需要敲碎的最少灰色磚塊數量cout << g[1];
}int main() {// 關閉輸入輸出流的同步,提高輸入輸出效率ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t = 1;// 循環調用 solve 函數,這里 t 為 1,即只調用一次while (t--) solve();return 0;
}
?