导航菜单
首页 >  蓝桥杯考试题目scrch  > 第十四届蓝桥杯省赛C++ B组所有题目以及题解(C++)【编程题均通过100%测试数据】

第十四届蓝桥杯省赛C++ B组所有题目以及题解(C++)【编程题均通过100%测试数据】

第一题《日期统计》【枚举】 【问题描述】

小蓝现在有一个长度为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.这个子序列可以按照下标顺序组成一个 yyy,ymmdd 格式的日期,并且要求这个日期是 2023 年中的某一天的日期,例如 20230902,20231223。yyyy 表示年份,mm 表示月份,dd 表示天数,当月份或者天数的长度只有一位时需要一个前导零补充。 请你帮小蓝计算下按上述条件一共能找到多少个不同的 2023 年的日期。对于相同的日期你只需要统计一次即可。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【代码】 #include using namespace std;int main() {int array[100] = {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};int daysInMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int ans = 0;for (int month = 1; month > n >> m; res = 0;for (int i = 1; i c;g[i][j] = c - '0';}dfs_0(0, 0);//从一个外海方格开始dfscout k;cin >> p >> st >> ed;vector ps, pe;for (int i = 0; i < p.size(); i ++){if(p[i] == st) ps.push_back(i);if(p[i] == ed) pe.push_back(i);}long long ans = 0;for (int i = 0; i < ps.size(); i ++){int x = ps[i];int X = x + k - 1;int l = 0, r = pe.size() - 1;while (l < r){int mid = l + r >> 1;if(pe[mid] >= X) r = mid;else l = mid + 1;}if(pe[l] >= X) ans += pe.size() - l;}cout 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 i+1,加上i-1->i+1if (i && i != k - 1) res += get(q[i - 1], q[i + 1]) - get(q[i - 1], q[i]) - get(q[i], q[i + 1]);// 跳过i(i是左端点),等同于砍掉i->i+1else if (!i) res -= get(q[i], q[i + 1]);// 跳过i(i是右端点),等同于砍掉i-1->ielse res -= get(q[i - 1], q[i]);printf("%lld ", res);}puts("");return 0;}第十题《砍树》【LCA+树上差分】 【题目描述】

【输入格式】

输入共 n+m 行,第一行为两个正整数 n,m。

后面 n−1 行,每行两个正整数 x_{i},y_{i} 表示第 i 条边的两个端点。

后面 m 行,每行两个正整数 a_{i},b_{i}

【输出格式】

一行一个整数,表示答案,如有多个答案,输出编号最大的一个。

【数据范围】

对于 30% 的数据,保证 1 < n ≤ 1000。 对于 100% 的数据,保证 1 < n ≤ 10^{5},1 ≤ m ≤ \frac{n}{2}

【输入样例】 6 2 1 2 2 3 4 3 2 5 6 5 3 6 4 5【输出样例】

4

【样例解释】

断开第 2 条边后形成两个连通块:{3,4},{1,2,5,6},满足 3 和 6 不连通,4 和 5 不连通。

断开第 4 条边后形成两个连通块:{1,2,3,4},{5,6},同样满足 3 和 6 不连通,4 和 5 不连通。

4 编号更大,因此答案为 4。

【思路】

题解来源:4963. 砍树 - AcWing题库

【代码】 #includeusing 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, m;std::vector e[N];int depth[N], fa[N][32];int f[N];int root;int ans;map mp;void bfs(int root){ms(depth, 0x3f);depth[0] = 0, depth[root] = 1;queue q;q.push(root);while (!q.empty()) {auto t = q.front();q.pop();for (int j : e[t]) {if (depth[j] > depth[t] + 1) {depth[j] = depth[t] + 1;q.push(j);fa[j][0] = t;for (int k = 1; k = 0; k--) {if (depth[fa[a][k]] >= depth[b]) {a = fa[a][k];}}if (a == b) return a;for (int k = 15; k >= 0; --k) {if (fa[a][k] != fa[b][k]) {a = fa[a][k];b = fa[b][k];}}return fa[a][0];}int dfs(int u, int fa) {int res = f[u];for (auto v : e[u]) {if (v == fa) continue;int g = dfs(v, u);if (g == m) {ans = max(ans, mp[ {v, u}]);}res += g;}return res;}void solve(){cin >> n >> m;for (int i = 0; i < n - 1; ++i) {int u, v;cin >> 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 < m; ++i) {int u, v;cin >> u >> v;int z = lca(u, v);f[u]++;f[v]++;f[z] -= 2;}dfs(1, -1);cout

相关推荐: