第十四届蓝桥杯大赛软件赛省赛(C/C++ 大学B组)
目录
- 试题 A. 日期统计
- 1.题目描述
- 2.解题思路
- 3.模板代码
- 试题 B.01 串的熵
- 1.题目描述
- 2.解题思路
- 3.模板代码
- 试题 C. 冶炼金属
- 1.题目描述
- 2. 解题思路
- 3.模板代码
- 试题 D. 飞机降落
- 1.题目描述
- 2. 解题思路
- 3.模板代码
- 试题 E. 接龙数列
- 1.题目描述
- 2. 解题思路
- 3.模板代码
- 试题 F. 岛屿个数
- 1.题目描述
- 2. 解题思路
- 3.模板代码
- 试题 G. 子串简写
- 1.题目描述
- 2. 解题思路
- 3.模板代码
- 试题 H.整数删除
- 1.题目描述
- 2. 解题思路
- 3.模板代码
- 试题 I. 景区旅游
- 1.题目描述
- 2. 解题思路
- 3.模板代码
- 试题 J. 砍树
- 1.题目描述
- 2. 解题思路
- 3. 模板代码
目前除 B、F题未补,其余题均已更完,经非官方数据测试均可AC。欢迎交流
(图片来源网络,侵删)试题 A. 日期统计
1.题目描述
小蓝现在有一个长度为 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 8 8;
-
- . 这个子序列可以按照下标顺序组成一个
y
y
y
y
m
m
d
d
yyyymmdd
yyyymmdd 格式的日期,并且
要求这个日期是 2023 2023 2023 年中的某一天的日期,例如 20230902 , 20231223 20230902,20231223 20230902,20231223。
y y y y yyyy yyyy 表示年份, m m mm mm 表示月份, d d dd dd 表示天数,当月份或者天数的长度只
有一位时需要一个前导零补充。
请你帮小蓝计算下按上述条件一共能找到多少个不同 的 2023 年的日期。
对于相同的日期你只需要统计一次即可。
2.解题思路
考虑八层循环枚举一下,中间需要进行减枝加快搜索步骤,不建议写 dfs,不然就像我一样在考场写烂,注意答案需要去重,答案为235。
3.模板代码
暂更
试题 B.01 串的熵
1.题目描述
没学过数学,暂更
2.解题思路
3.模板代码
试题 C. 冶炼金属
1.题目描述
小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个
炉子有一个称作转换率的属性 V V V, V V V 是一个正整数,这意味着消耗 V V V 个普通金
属 O O O 恰好可以冶炼出一个特殊金属 X X X,当普通金属 O O O 的数目不足 V V V 时,无法
继续冶炼。
现在给出了 N N N 条冶炼记录,每条记录中包含两个整数 A A A 和 B B B,这表示本次投入了 A A A 个普通金属 O O O,最终冶炼出了 B B B 个特殊金属 X X X。每条记录都是独立
的,这意味着上一次没消耗完的普通金属 O O O 不会累加到下一次的冶炼当中。
根据这 N N N 条冶炼记录,请你推测出转换率 V V V 的最小值和最大值分别可能是多少,题目保证评测数据不存在无解的情况。
2. 解题思路
如果看过样例的话,显然答案两个上下界都是可以直接二分出来的。因为式子的结构都是 A C = B \frac{A}{C} = B CA=B。 A A A 是不变的,我们先考虑二分求最小的 C C C,因为需要保证所有式子的 B B B 都不变,如果 C C C 太小,显然会有某一组的 B B B 增大,所以需要保证每一组都符合a[i]/x = B。
3.模板代码
#include using namespace std; typedef long long LL; typedef unsigned long long uLL; typedef pair PII; #define pb(s) push_back(s); #define SZ(s) ((int)s.size()); #define ms(s,x) memset(s, x, sizeof(s)) #define all(s) s.begin(),s.end() const int inf = 0x3f3f3f3f; const int mod = 1000000007; const int N = 200010; int n; int a[N], b[N]; bool check(LL x) { for (int i = 1; i if (a[i] / x b[i]) return false; } return true; } bool check2(LL x) { for (int i = 1; i if (a[i] / x n; for (int i = 1; i > a[i] >> b[i]; LL l = 1, r = 1e9; while (l > 1; if (check(mid)) r = mid; else l = mid + 1; } int s = r; l = 1, r = 1e9; while (l > 1; if (check2(mid)) l = mid; else r = mid - 1; } cout ios_base :: sync_with_stdio(false); cin.tie(0); cout.tie(0); int t = 1; while (t--) { solve(); } return 0; } cin n; for (int i = 0; i > b[i] >> c[i]; std::vector d(n); auto check = [&]() { int v = 0; for (int i = 0; i x; b[i] = x % 10; string s = to_string(x); a[i] = s[0] - '0'; } for (int i = 1; i f[b[i]] = max(f[b[i]], f[a[i]] + 1); } int ans = 0; for (int i = 0; i ios_base :: sync_with_stdio(false); cin.tie(0); cout.tie(0); int t = 1; while (t--) { solve(); } return 0; } cin k s >> c1 >> c2; int n = s.size(); s = '?' + s; for (int i = 1; i a[i] = (s[i] == c2); a[i] += a[i - 1]; } LL ans = 0; for (int i = 1; i + k - 2 k; priority_queueq; for (int i = 1; i LL v; cin > v; q.push({v, i}); pre[i] = i - 1; ne[i] = i + 1; } int g = n - k; while (q.size() > g) { auto p = q.top(); q.pop(); LL v = p.first, ix = p.second; if (cnt[ix]) { q.push({v + cnt[ix], ix}); cnt[ix] = 0; } else { int l = pre[ix], r = ne[ix]; cnt[l] += v; cnt[r] += v; ne[l] = r; pre[r] = l; } } std::vector a(n + 1); for (int i = 0; i > n >> m; for (int i = 0; i > u >> v >> c; e[u].push_back({v, c}); e[v].push_back({u, c}); } bfs(1); dfs(1, -1); std::vector g(m + 1); for (int i = 1; i > g[i]; LL ans = 0; for (int i = 1; i > u >> v; mp[ {u, v}] = mp[ {v, u}] = i + 1; e[u].push_back(v); e[v].push_back(u); } bfs(1); for (int i = 0; i > u >> v; int z = lca(u, v); f[u]++; f[v]++; f[z] -= 2; } dfs(1, -1); cout ios_base :: sync_with_stdio(false); cin.tie(0); cout.tie(0); int t = 1; while (t--) { solve(); } return 0; }
- . 这个子序列可以按照下标顺序组成一个
y
y
y
y
m
m
d
d
yyyymmdd
yyyymmdd 格式的日期,并且
-