2023第十四届蓝桥杯C/C++B组省赛题解

小明 2025-04-28 23:46:26 6

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
                          

                          现在他想要从这个数组中寻找一些满足以下条件的子序列:

                          ()
                          1. 子序列的长度为8;

                          2. 这个子序列可以按照下标顺序组成一个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
微信