2023第十四届蓝桥杯国赛 C/C++ 大学 B 组

2024-06-04 8717阅读

文章目录

  • 前言
  • 试题 A: 子 2023
    • 作者思考
    • 题解
    • 答案
    • 试题 B: 双子数
      • 作者思考
      • 题解
      • 试题 C: 班级活动
        • 作者思考
        • 题解
        • 试题 D: 合并数列
          • 作者思考
          • 题解
          • 试题 E: 数三角
            • 作者思考
            • 题解
            • 试题 F: 删边问题
              • 作者思考
              • 题解
              • 试题 G: AB 路线
                • 作者思考
                • 题解
                • 试题 H: 抓娃娃
                  • 作者思考
                  • 题解
                  • 试题 I: 拼数字
                  • 试题 J: 逃跑

                    前言

                    第一次接触写国赛的题,在下才疏学浅,题解如有错误请指正。🤗

                    A ~ H有题解,其中E题作者打的暴力。

                    如果能帮助你的话,点点赞吧!谢谢🤝

                    试题 A: 子 2023

                    本题总分:5 分

                    【问题描述】

                    小蓝在黑板上连续写下从 1 到 2023 之间所有的整数,得到了一个数字序列:

                    S = 12345678910111213 . . . 20222023。

                    小蓝想知道 S 中有多少种子序列恰好等于 2023?

                    提示,以下是 3 种满足条件的子序列(用中括号标识出的数字是子序列包含的数字):

                    1[2]34567891[0]111[2]1[3]14151617181920212223…

                    1[2]34567891[0]111[2]131415161718192021222[3]…

                    1[2]34567891[0]111213141516171819[2]021222[3]…

                    注意以下是不满足条件的子序列,虽然包含了 2、0、2、3 四个数字,但是顺序不对:

                    1[2]345678910111[2]131415161718192[0]21222[3]…

                    【答案提交】

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

                    作者思考

                    作完省赛的就知道,这不就是省赛E题的接龙数列嘛😅。简单的dp就可以。分别以2 0 2 3(要转化,因为有两个2)结尾dp就可以了👻。

                    虽然正解是dp,但是暴力 + 剪枝也可以做,就是跑的有些慢。作者本地跑差不多50s。

                    还一个坑,就是如果你不开long long就会得到错的答案:1189693313

                    题解

                    #include
                    using namespace std;
                    #define int long long // 开long long 
                    string s; 
                    int f1() {
                    	 int cnt = 0;
                     	for (int a = 0; a  x, q2.push(x);
                    	
                    	while (!q1.empty()) {
                    		tp1 = q1.front();
                    		tp2 = q2.front();
                    		if (tp1 == tp2) q1.pop(), q2.pop();
                    		else if (tp1  p[i].x >> p[i].y;
                    	
                    	// 遍历所有点,并且要避免重复 
                    	for (int i = 1; i 
                    		for (int j = 1; j  b && b + c > a)
                    					if ((a == b) || (a == c) || (b == c)) ans++;
                    			}
                    		}
                    	}
                    	
                    	cout 
                    	dfn[u] = low[u] = ++dfn_cnt;
                    	for (int v : G[u]) {
                    		if (!dfn[v]) {
                    			tarjan(v, u);
                    			w[u] += w[v];
                    			low[u] = min(low[u], low[v]);
                    			if (low[v]  dfn[u]) ans = min(ans, llabs(sum_w - 2 * w[v]));
                    		} else if (dfn[v]  n >> m;
                    	for (int i = 1; i > w[i], sum_w += w[i];
                    	for (int i = 1, u, v; i 
                    		cin > u >> v;
                    		G[u].push_back(v);
                    		G[v].push_back(u);
                    	}
                    	tarjan(1, 0);
                    	if (w[1] != sum_w) cout 
                        ios::sync_with_stdio(0);
                        cin.tie(0), cout.tie(0);
                        int t = 1;
                        /*cin  t;*/
                        while (t--) slove();
                        return 0;
                    }
                    0, 0, 0, 1, -1};
                    int dy[] = {0, 1, -1, 0, 0};
                    struct node {
                        int x;
                        int y;
                        int step;
                    };
                    int n, m, k;
                    char G[maxl][maxl];
                    bool vis[maxl][maxl][N];
                    int dis[maxl][maxl][N];
                    queue
                        cin  n  m >> k;
                        for (int i = 1; i 
                            for (int j = 1; j 
                                cin  G[i][j];
                            }
                        }
                        vis[1][1][1] = 1;
                        q.push({1, 1, 1});
                        while (!q.empty()) {
                            node tp = q.front();
                            q.pop();
                            for (int i = 1; i 
                                int x = tp.x + dx[i];
                                int y = tp.y + dy[i];
                                if (x  m) continue; // 地图边界判断
                                // [1, k]走了k步, 所以第k + 1步要进行变号(注意这里用的是tp.step)
                                if (G[x][y] == G[tp.x][tp.y] && tp.step == k) continue; // 走了k + 1步, 没有变号
                                if (G[x][y] != G[tp.x][tp.y] && tp.step != k) continue; // 没走k + 1步,变号了
                                int step = (tp.step) % k + 1;
                                if (vis[x][y][step]) continue; // 这个点走过了第step步
                                vis[x][y][step] = 1;
                                dis[x][y][step] = dis[tp.x][tp.y][tp.step] + 1;
                                q.push({x, y, step});
                            }
                        }
                        int ans = maxn;
                        for (int i = 1; i 
                            if (vis[n][m][i]) {
                                ans = min(ans, dis[n][m][i]); // 到达终点的可能步数全都遍历一遍
                            }
                        }
                        if (ans == maxn) cout 
                        ios::sync_with_stdio(0);
                        cin.tie(0), cout.tie(0);
                        int t = 1;
                        /*cin  t;*/
                        while(t--) slove();
                        return 0;
                    }
                    
                    	cin  n > m;
                    	for (int i = 1, l, r; i 
                    		cin > l >> r;
                    		sum[l + r]++;
                    	}
                    	for (int i = 1; i  l >> r;
                    		l *= 2;
                    		r *= 2;
                    		cout 

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]