第十四届蓝桥杯省赛C++ B组(个人经历 + 题解) 您所在的位置:网站首页 蓝桥杯省赛题目难度是洛谷的哪一级 第十四届蓝桥杯省赛C++ B组(个人经历 + 题解)

第十四届蓝桥杯省赛C++ B组(个人经历 + 题解)

2024-05-29 02:36| 来源: 网络整理| 查看: 265

参赛感受

这是我第一次参加蓝桥杯的省赛,虽然没什么参赛经验,但是自己做了很多前几届蓝桥杯的题,不得不说,这一届蓝桥杯省赛的难度相较于之前而言还是比较大的。之前很流行蓝桥杯就是暴力杯的说法,但是随着参赛人数的增多,比赛认可度的提升,比赛题目的质量也明显越来越高了。这次省赛涉及知识点非常全面,而且难度都不小(题目涉及了暴力、模拟、数学、递归、动态规划、广度优先搜索、前缀和、最近公共祖先等)。总得来说,大概就是“你知道题目考的是什么,但是就是不太会做”。这也是我在比赛过程中的真实感受。

不过最后成绩还是不错的,拿了省一。我算了一下自己的分数,大概是50-60分,顶多也就是对了五道题的样子。我考完试都觉得可能完了,结果这个分数居然还能排在江苏省一的中游,看来我运气还是不错的哈哈哈。

时隔一个月,有些平台上已经有了第十四届蓝桥杯的题目,我打算记录一下自己参赛的经历并写下每道题的题解。 PS: 本博客中编程题的代码都是在Acwing平台上提交且通过的代码。

A:日期统计 暴力枚举 解题思路

第一道题是一个填空题,大致意思就是一个由100个数字组成的序列,统计符合"\(2023mmdd\)"格式的无重复子序列的个数,"\(2023mmdd\)"表示一个2023年的一个合法的日期,其中"\(mm\)"表示月份的两位数字,"\(dd\)"表示天数的两位数字。

我一开始有点不敢写暴力,毕竟要八重循环呢!后来发现前四重循环在判断年份的时候,由于年份确定为"2023",故只需要判断当前循环是否符合即可,如果不符合,就跳过这一整层的循环,比如说第一层循环,只需要判断是否等于2就行,如果不等于2,就跳过。这样前面四重循环可以节省大量的运行时间,整个八重循环基本上就变成一个四重循环了,总共就100个数,所以可以在一秒左右的时间就跑出结果。

对于判重,我使用的是\(set\),每出现一个合法日期,用 \(月份 × 100 + 天数\) 设为对应哈希值,放入\(set\)中。最后返回\(set\)的大小即答案。

答案: 235

个人战况

这道题做出来了,但是消耗了很多时间,一直不敢写暴力,自己在考场上可能也有紧张的因素,而且我一直都喜欢睡懒觉,所以上午做题可能多少也影响到我的状态了哈哈哈。幸好最后还是做出来了。

代码 #include #include #include using namespace std; const int N = 110; int num[N]; set st; //利用set去重 int day[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int main(){ ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); for(int i = 0; i < 100; i ++ ) cin >> num[i]; //输入数据 for(int y1 = 0; y1 < 100; y1 ++ ){ if(num[y1] != 2) continue; for(int y2 = y1 + 1; y2 < 100; y2 ++ ){ if(num[y2] != 0) continue; for(int y3 = y2 + 1; y3 < 100; y3 ++ ){ if(num[y3] != 2) continue; for(int y4 = y3 + 1; y4 < 100; y4 ++ ){ if(num[y4] != 3) continue; //判断月份和天数 for(int m1 = y4 + 1; m1 < 100; m1 ++ ) for(int m2 = m1 + 1; m2 < 100; m2 ++ ) for(int d1 = m2 + 1; d1 < 100; d1 ++ ) for(int d2 = d1 + 1; d2 < 100; d2 ++ ){ int m = num[m1] * 10 + num[m2], d = num[d1] * 10 + num[d2]; if(m >= 1 && m = 1 && d a >> b; maxv = min(maxv, a / b); minv = max(minv, a / (b + 1) + 1); } cout > n; for(int i = 0; i < n; i ++ ){ int t, d, l; cin >> t >> d >> l; p[i] = {t, d, l}; } memset(st, 0, sizeof(st)); cout n; for(int i = 1; i > s; int a = s[0] - '0', b = s.back() - '0'; dp[b] = max(dp[b], dp[a] + 1); res = max(res, dp[b]); } cout m) continue; if(g[nx][ny] == '0' || vis[nx][ny]) continue; q.push({nx, ny}), vis[nx][ny] = true; } } } //外层海洋BFS void bfs_sea(int sx, int sy){ queue q; q.push({sx, sy}); vis[sx][sy] = true; while(!q.empty()){ auto [x, y] = q.front(); q.pop(); for(int k = 0; k < 8; k ++ ){ int nx = x + dx[k], ny = y + dy[k]; if(nx < 0 || nx > n + 1 || ny < 0 || ny > m + 1 || vis[nx][ny]) continue; if(g[nx][ny] == '1') bfs(nx, ny), res ++ ; //如果遇到外层海水领近的陆地 else q.push({nx, ny}), vis[nx][ny] = true; } } } int main(){ ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int T; cin >> T; while(T -- ){ cin >> n >> m; res = 0; memset(g, '0', sizeof(g)); memset(vis, 0, sizeof(vis)); for(int i = 1; i g[i][j]; bfs_sea(0, 0); cout k; cin >> s + 1 >> a >> b; int n = strlen(s + 1); //计算字符1的前缀和 for(int i = 1; i k; priority_queue q; //小根堆 for(int i = 1; i > x; q.push({x, i}); l[i] = i - 1, r[i] = i + 1; //记录左右相邻的下标 } while((int)q.size() > n - k){ auto [cur, idx] = q.top(); q.pop(); if(c[idx]) q.push({cur + c[idx], idx}), c[idx] = 0; //如果c[idx]不为0,当前最小值不能弹出,累加后入队 else{ //否则 当前最小值可以最为被选择的数 c[l[idx]] += cur, c[r[idx]] += cur; //左右下标累加值增加 l[r[idx]] = l[idx], r[l[idx]] = r[idx]; //左右相邻下标更改 } } while(!q.empty()){ auto [cur, idx] = q.top(); q.pop(); res[idx] = cur + c[idx]; } for(int i = 1; i k; init(); for(int i = 0; i < n - 1; i ++ ){ int u, v, c; cin >> u >> v >> c; add(u, v, c), add(v, u, c); } for(int i = 1; i > a[i]; for(int i = 1; i v; query[u].push_back(v), query[v].push_back(u); } tarjan(1); dfs(1, -1); cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有