2023第十四届蓝桥杯C/C++B组省赛题解
2023蓝桥C/C++B组省赛
文章目录
- 2023蓝桥C/C++B组省赛
- 试题A: 日期统计
- 题目描述
- 枚举
- 参考代码
- 试题B: 01 串的熵
- 题目描述
- 枚举|模拟
- 参考代码
- 试题C: 冶炼金属
- 题意描述
- 取交集
- 参考代码
- 试题D: 飞机降落
- 题意描述
- DFS+剪枝, 懒得写
- 试题E: 接龙数列
- 题意描述
- DP
- 参考代码
- 试题F: 岛屿个数
- 题意描述
- dfs | 连通块
- 参考代码
- 试题G: 子串简写
- 题意描述
- 前缀和
- 参考代码
- 试题H: 整数删除
- 题意描述
- 双向链表 | 最小堆
- 参考代码
- 试题I: 景区导游
- 题意描述
- 带权LCA
- 参考代码
- 试题J: 砍树
- 题意描述
- 树上差分
- 参考代���
试题A: 日期统计
题目描述
【问题描述】
()小蓝现在有一个长度为100 的数组,数组中的每个元素的值都在0 到9 的范围之内。数组中的元素从左至右如下所示:
5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 3 8 5 1 6 3 4 6 7 0 7 8 2 7 6 8 9 5 6 5 6 1 4 0 1 0 0 9 4 8 0 9 1 2 8 5 0 2 5 3 3
现在他想要从这个数组中寻找一些满足以下条件的子序列:
()-
子序列的长度为8;
-
这个子序列可以按照下标顺序组成一个yyyymmdd 格式的日期,并且
要求这个日期是2023 年中的某一天的日期,例如20230902,yyyy 表示年份,mm 表示月份,dd 表示天数,当月份或者天数的长度只有一位时需要一个前导零补充。
请你帮小蓝计算下按上述条件一共能找到多少个不同的2023 年的日期。
对于相同的日期你只需要统计一次即可。
枚举
用八重循环直接枚举每一位数字, 题目中的日期序列有很多限制, 如前四位必须是2023, 又比如月份只能以0或1开头等等。利用这些限制能大大降低运行时间, 实测只要限制了前四位, 基本是瞬间跑出结果。
注意需要用哈希表去重。
参考代码
// // Created by trudbot on 2023/4/9. // #include using namespace std; int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; set res; void check(int m, int d) { if (m 12 || d days[m]) return; res.insert(m * 100 + d); } int main () { int ns[100]; for (int & n : ns) cin >> n; for (int a = 0; a b; int l = a / (b + 1) + 1, r = a / b; mn = max(mn, l), mx = min(mx, r); } cout int n, mx = 0; cin n; for (int i = 0; i > n >> m; res = 0; for (int i = 1; i char c; cin c; g[i][j] = c - '0'; } dfs_0(0, 0);//从一个外海方格开始dfs cout int k; cin k; string s; char a, b; cin >> s >> a >> b; for (int i = 1; i r[l[x]] = r[x], l[r[x]] = l[x]; v[l[x]] += v[x], v[r[x]] += v[x]; } int main () { int n, k; cin n k; r[0] = 1, l[n + 1] = n; priority_queue h; for (int i = 1; i > v[i], l[i] = i - 1, r[i] = i + 1, h.push({v[i], i}); while (k --) { auto p = h.top(); h.pop(); if (p.first != v[p.second]) h.push({v[p.second], p.second}), k ++; else del(p.second); } int head = r[0]; while (head != n + 1) { cout dep[u] = dep[fa] + 1, dist[u] = d, f[u][0] = fa; for (int i = 1; (1 if (p.first == fa) continue; dfs(p.first, u, d + p.second); } } int lca(int a, int b) { if (dep[a] n >> k; for (int i = 1; i > u >> v >> t; g[u].push_back({v, t}), g[v].push_back({u, t}); } vector a(k); for (auto &x : a) cin >> x; dfs(1, 0, 0); ll sum = 0; for (int i = 1; i n >> m; for (int i = 1; i > a >> b; g[a].push_back({b, i}), g[b].push_back({a, i}); } init(1, 0); for (int i = 0; i > a >> b; add(a, b); } dfs(1, 0); int res = -1; for (int i = 1; i res)) res = w[i]; cout
-
The End