第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组思考+总结

Posted 时雨h

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组思考+总结相关的知识,希望对你有一定的参考价值。

第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组思考+总结

公告
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组
C题
刷题统计
D题
修剪灌木
E题
X进制减法
F题
统计子矩阵
G题
积木画
H题
扫雷
I题
李白打酒加强版
J题
砍竹子
注意事项:1. 对于编程题目,要求选手给出的解答完全符合 GNU C/C++ 标准,不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的 API。2. 代码中允许使用 STL 类库。3. main 函数结束必须返回 0。4. 所有依赖的函数必须明确地在源文件中 #include 5. 提交时,注意选择使用C或C++语言。

试题A: 九进制转十进制

本题总分:5分

【问题描述】

九进制正整数 (2022), 转换成十进制等于多少?

【答案提交】

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

题解:进制转换

2 * 9^0 + 2 * 9^1 + 0 + 2 * 9^3 = 1478

试题B: 顺子日期

本题总分:5分

【问题描述】

小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456等。顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。例如20220123就是一个顺子日期,因为它出现了一个顺子: 123; 而20221023则不是一个顺子日期,它一个顺子也没有。小明想知道在整个2022年份中,一共有多少个顺子日期。

【答案提交】

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

题解:日历
很多人在讨论 012 算不算顺子,因为题目里说 0123 中的顺子是 123,我是算了的,不算的话答案应该是 4

年份 2022 是不变的,而且不可能搭上顺子,所以只考虑后四位即可
可能搭上顺子的月份有:
    1月:0120 ~ 012910 个,顺子是 012 (其中 0123 可以认为顺子是 123)
    10月:1012,顺子是 012
    11月:1123,顺子是 123
    12月:12301231,顺子是 123
一共 14

蓝桥杯2022年第十三届省赛真题-刷题统计

时间限制: 1s 内存限制: 256MB 提交: 8920 解决: 1735

题目描述
小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n 题?

输入格式
输入一行包含三个整数 a, b 和 n.

输出格式
输出一个整数代表天数。

样例输入
复制

10 20 99
样例输出
复制

8
提示
对于 50% 的评测用例,1 ≤ a, b, n ≤ 106 . 对于 100% 的评测用例,1 ≤ a, b, n ≤ 1018 .
80分解法:

#include<stdio.h>
long long int f(long long int n,long long int a,long long int b)      //n代表总题数,a代表星期一到星期五做的题的数量,b代表星期六和星期天做题的数量

    int flag;
    long long int sum=0;          //flag用来记录最后是在1-5停的,还是在6-7停的
    while(n!=0)
    
        n-=5*a;                 //先算1-5
        if(n<0)
        
            flag=1;
            break;
        
        sum+=5;
        n-=2*b;                  //再算6-7
        if(n<0)
        
            flag=2;
            break;
        
        sum+=2;
    
    if(flag==1)               //如果是在1-5停的话
    
        n+=5*a;                //加回来,然后算是在第几天的
        while(n>a)
        
            n-=a;
            sum++;
        
        sum++;                //不满一天就加回去
    
    else if(flag==2)
    
        n+=2*b;
        while(n>b)
        
            n-=b;
            sum++;
        
        sum++;
    
    return sum;

int main()

    long long int a,b,n;
    scanf("%lld%lld%lld",&a,&b,&n);
    printf("%lld",f(n,a,b));
    return 0;


AC代码:

解题思路:

先用ans表示有多少周,n/(5*a+b*2)

工作日有二天,周末有二天

sum表示天数

用n-5*a+2*b)*ans=剩余的天数

剩余的天数一定会落在工作日,或者周末这两种情况;

再用(n-(5*a+2*b)*ans)/a表示能在工作日完成的a题,

如果(n-(5*a+2*b)*ans)%a 不等于0,说明有剩余,还要加一天

在周末这种情况也同理;





注意事项:对于 100% 的评测用例,1 ≤ a, b, n ≤ 1018,要用long long
参考代码:

#include<bits/stdc++.h>
using namespace std;
int main()

    long long a,b,n;
    long long ans=0,sum=0;
    scanf("%lld%lld%lld",&a,&b,&n);
    ans+=n/(5*a+b*2);
    sum=ans*7;
    if((n-(a*5+b*2)*ans)<=5*a)
    
        sum+=(n-(5*a+2*b)*ans)/a;
        if((n-(5*a+2*b)*ans)%a!=0)
        
            sum++;
        
    
    else
    
        sum+=5;
        sum+=((n-(5*a+2*b)*ans)-5*a)/b;
        if(((n-(5*a+2*b)*ans)-5*a)%b!=0)
        
            sum++;
        
    
    printf("%lld",sum);

题目 2657: 蓝桥杯2022年第十三届省赛真题-修剪灌木

时间限制: 1s 内存限制: 256MB 提交: 2361 解决: 1502
题目描述
爱丽丝要完成一项修剪灌木的工作。有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌木,让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。灌木每天从早上到傍晚会长高 1 厘米,而其余时间不会长高。在第一天的早晨,所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。
输入格式
一个正整数 N ,含义如题面所述。
输出格式
输出 N 行,每行一个整数,第i行表示从左到右第 i 棵树最高能长到多高。
样例输入
3
样例输出
4
2
4
提示
对于 30% 的数据,N ≤ 10. 对于 100% 的数据,1 < N ≤ 10000.

#include<stdio.h>
int main()

    int n;
    int a[10005];
    scanf("%d",&n);
    if(n%2==0)//n为偶数的时候
    
        for(int i=1;i<=n/2;i++)
        
            a[i]=2*(n-i);
            printf("%d\\n",a[i]);
        
        for(int j=n/2+1;j<=n;j++)
        
            a[j]=a[n+1-j];
            printf("%d\\n",a[j]);
        
    
    if(n%2!=0)//n为奇数的时候
    
        for(int i=1;i<=n/2;i++)
        
            a[i]=2*(n-i);
            printf("%d\\n",a[i]);
        
        printf("%d\\n",n-1);
        for(int j=n/2+2;j<=n;j++)
        
            a[j]=a[n+1-j];
            printf("%d\\n",a[j]);
        
    
    return 0;

题目 2658: 蓝桥杯2022年第十三届省赛真题-X进制减法

时间限制: 1s 内存限制: 256MB 提交: 2258 解决: 651
题目描述
进制规定了数字在数位上逢几进一。

X 进制是一种很神奇的进制,因为其每一数位的进制并不固定!例如说某种 X 进制数,最低数位为二进制,第二数位为十进制,第三数位为八进制,则 X 进制数 321 转换为十进制数为 65。

现在有两个 X 进制表示的整数 A 和 B,但是其具体每一数位的进制还不确定,只知道 A 和 B 是同一进制规则,且每一数位最高为 N 进制,最低为二进制。请你算出 A − B 的结果最小可能是多少。

请注意,你需要保证 A 和 B 在 X 进制下都是合法的,即每一数位上的数字要小于其进制。

输入格式
第一行一个正整数 N,含义如题面所述。

第二行一个正整数 Ma,表示 X 进制数 A 的位数。

第三行 Ma 个用空格分开的整数,表示 X 进制数 A 按从高位到低位顺序各个数位上的数字在十进制下的表示。

第四行一个正整数 Mb,表示 X 进制数 B 的位数。

第五行 Mb 个用空格分开的整数,表示 X 进制数 B 按从高位到低位顺序各个数位上的数字在十进制下的表示。

请注意,输入中的所有数字都是十进制的。

输出格式
输出一行一个整数,表示 X 进制数 A − B 的结果的最小可能值转换为十进制后再模 1000000007 的结果。
样例输入
11
3
10 4 0
3
1 2 0
样例输出
94
提示
当进制为:最低位 2 进制,第二数位 5 进制,第三数位 11 进制时,减法得到的差最小。此时 A 在十进制下是 108,B 在十进制下是 14,差值是 94。

对于 30% 的数据,N ≤ 10; Ma, Mb ≤ 8. 对于 100% 的数据,2 ≤ N ≤ 1000; 1 ≤ Ma, Mb ≤ 100000; A ≥ B.

解题背景
1:理解进制的转化算法
2:理解如何达到最小值
注意:
   1:如何是使得差值最小呢,我们可以利用dp的思想,要使得整体最小,那么组成他的各个部分也是最小,那么问题就变成了,如何使得各个部分的值最小;
   2:每个部分有对应位上的差值组成,那么,要使得这个差值乘的进制数尽可能小就可以了;
   3:如何使得进制尽可能小呢,进制的区间在2~N之间,那么只需要在这个区间之内,选取能包含a[i]和b[i]两个值的最小进制值就ok了,至此,思路就出来了
代码
#include<stdio.h> 
int a[100005]=0;
int b[100005]=0;
int mod= 1000000007;
int max(int x,int y)

    return x>y?x:y;
 
int main()

    //录入数据 
    int N,Ma,Mb;
    scanf("%d%d",&N,&Ma);
    for(int i=Ma;i>=1;i--)
    
        scanf("%d",&a[i]);
    
    scanf("%d",&Mb);
    for(int i=Mb;i>=1;i--)
    
        scanf("%d",&b[i]);
    
    //处理获取进制数组
    int jz[100005]=0; 
    for(int i=Ma;i>=1;i--)//A-B以A 的位数为标准 
    
        jz[i]=max(max(a[i]+1,b[i]+1),2);//找出对应位置上最小的进位,且进位不小于2 
        //printf("%d ",jz[i]);
    
    //printf("\\n");
/*    //处理得到对应为的乘数 (超时O(n^2),换一种搞法) 
    int cs[100005]=0; 
    for(int i=Ma;i>=1;i--) 
    
        cs[i]=1;
        for(int j=i-1;j>=1;j--)//乘数不包括自身进位值 
        
            cs[i]*=jz[j];
        
        //printf("%d ",cs[i]);
    
    //printf("\\n");
    //处理得到最小值的和
    int sum=0;
    for(int i=Ma;i>=1;i--)//从高位加起 
    
        sum+=(a[i]-b[i])*cs[i];
        sum%=mod;
    */
    long long sum=0;
    for(int i=Ma;i>=2;i--) 
    
        sum=((sum+a[i]-b[i])*jz[i-1])%mod;
    
    sum+=(a[1]-b[1]);
    printf("%lld\\n",sum);
    return 0;    

试题F: 统计子矩阵

时间限制:1.0s 内存限制: 256.0MB 本题总分:15分

【问题描述】

给定一个N×M的矩阵A,请你统计有多少个子矩阵(最小1×1,最大NxM)满足子矩阵中所有数的和不超过给定的整数K?

【输入格式】

第一行包含三个整数N,M和K.
之后N行每行包含M个整数,代表矩阵A.

【输出格式】

一个整数代表答案。

【样例输入】

3 4 10
1 2 3 4
5 6 7 8
9 10 11 12
1
2
3
4
【样例输出】

19
1
【样例说明】

满足条件的子矩阵一共有19,包含:

大小为1×1的有10个。
大小为1×2的有3个。
大小为1×3的有2个。
大小为1×4的有1个。
大小为2×1的有3个。

【评测用例规模与约定】

对于30%的数据, N, M ≤ 20.

对于70%的数据,N, M ≤ 100.

对于100%的数据,1 ≤ N,M ≤ 500; 0 ≤ Aij ≤1000;1 ≤ K ≤ 250000000.

题解:二维前缀和+二分
一看题就想到前缀和了,不过暴力枚举的话肯定超时了,想了个半枚举+二分查找的歪点子,时间复杂度大概 是O(n^3 * log(n)),大概有 10^9 了,再加上一点剪枝,能不能过看运气了

假设 (i, j) 是子矩阵的起点坐标,(x, y) 是终点坐标,枚举 i, j, x,二分查找符合条件的最大 y,就是找起点为 (i, j) ,终点在第 x 行最多有多少个矩阵

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD = 1000000007;
const int N = 505;

ll m, n, k;
ll a[N][N];
ll ans = 0;

ll getsum(int i, int j, int x, int y) 
	return a[x][y] - a[i - 1][y] - a[x][j - 1] + a[i - 1][j - 1];


int main() 
	cin >> m >> n >> k;
	for (int i = 1; i <= m; i++) 
		for (int j = 1; j <= n; j++) 
			cin >> a[i][j];
			a[i][j] += a[i - 1][j] - a[i - 1][j - 1] + a[i][j - 1];
		
	
	for (int i = 1; i <= m; i++) 
		for (int j = 1; j <= n; j++) 
			if (getsum(i, j, i, j) > k) continue;
			for (int x = i; x <= m; x++) 
				int l = j, r = n;
				while (l < r) 
					int mid = (l + r + 1) >> 1;
					if (getsum(i, j, x, mid) > k) r = mid - 1;
					else l = mid;
				
				if (getsum(i, j, x, l) > k) break;
				ans += l - j + 1;
			
		
	
	cout << ans << endl;
	return 0;

真·题解:前缀和 + 连续子段个数
这题有解了,其实是个套路题
先确定子矩阵的两个列边界,然后做一次行遍历,就是求符合条件的连续子段个数(双指针滑动窗口),复杂度缩小到 O(n^3)
由于每次只需拿到某一行内的和,只做一维前缀和即可

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD = 1000000007;
const int N = 505;

ll m, n, k;
ll a[N][N];
ll ans = 0;

int main() 
	cin >> m >> n >> k;
	for (int i = 1; i <= m; i++) 
		for (int j = 1; j <= n; j++) 
			cin >> a[i][j];
			a[i][j] += a[i][j - 1];
		
	
	for (int i = 1; i <= n; i++) 
		for (int j = i; j <= n; j++) 
			int left = 1;
			ll cur = 0;
			for (int right = 1; right <= m; right++) 
				cur += a[right][j] - a[right][i - 1];
				while (cur > k) 
					cur -= a[left][j] - a[left][i - 1];
					left++;
				
				ans += right - left + 1;
			
		
	
	cout << ans << endl;
	return 0;

试题G: 积木画

时间限制: 1.0s 内存限制:256.0MB 本题总分:20分

【问题描述】

小明最近迷上了积木画,有这么两种类型的积木,分别为Ⅰ型(大小为2个单位面积)和L型(大小为3个单位面积):

同时,小明有一块面积大小为2×N的画布,画布由2×N个1×1区域构成。小明需要用以上两种积木将画布拼满,他想知道总共有多少种不同的方式? 积木可以任意旋转,且画布的方向固定。

【输入格式】

输入一个整数N,表示画布大小。

【输出格式】

输出一个整数表示答案。由于答案可能很大,所以输出其对1000000007取模后的值

【样例输入】

3

【样例输出】

5

【样例说明】

五种情况如下图所示,颜色只是为了标识不同的积木;

【评测用例规模与约定】

对于所有测试用例,1 ≤ N ≤ 10000000.

题解:动态规划(错解)
要摆出 n 列方格,可以在 n - 1 列方格后加一个竖着的 I 形积木,也可以在 n - 2 方格后加两个横着的 I 形积木,也可以在 n - 3 列方格上后加 两个 L 形积木的两种摆法

用 dp[i] 表示 i 列方格的摆法

则有,当 i >= 3 时 dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3] * 2;

2020 第十一届蓝桥杯大赛软件赛省赛(第二场),C/C++大学B组题解

第1题 —— 门牌制作 (5分)

  • 枚举1到2020,判断有多少个字符2。
  • 答案624
#include<bits/stdc++.h>
using namespace std;

int main()
    int cnt = 0;
    for(int i = 1; i <= 2020; i++)
        int x = i;
        while(x)
            if(x%10==2)cnt++;
            x /= 10;
        
    
    cout<<cnt<<"\\n";
    return 0;



第2题 —— 既约分数 (5分)

  • 双层循环枚举1到2020,gcd分子分母=1的累加
  • 答案为2481215
#include<bits/stdc++.h>
using namespace std;

int main()
    int cnt = 0;
    for(int i = 1; i <= 2020; i++)
        for(int j = 1; j <= 2020; j++)
            if(__gcd(i,j)==1)cnt++;
        
    
    cout<<cnt<<"\\n";
    return 0;



第3题 —— 蛇形填数 (10分)

  • 发现每次对角线值的差是4的倍数,可以通过递推的方式计算
  • 答案761
#include<bits/stdc++.h>
using namespace std;

int main()
    int x = 1;
    //+4->2,+8->3,+19->20
    for(int i = 1; i <= 19; i++)
        x += i*4;
    
    cout<<x;
    return 0;



第4题 —— 跑步锻炼 (10分)

  • 暴力遍历每一天,算出每一天的是星期几并累加跑多少,注意判断闰年
  • 答案8879
#include<bits/stdc++.h>
using namespace std;
int	a[13]=0,31,28,31,30,31,30,31,31,30,31,30,31;
int main()
    int sum = 0, week = 6;
    for(int year=2000; year <= 2020; year++)
        if((year%400==0) || (year%4==0&&year%100!=0))a[2] = 29;
        else a[2] = 28;
        for(int month = 1; month <= 12; month++)
            for(int day = 1; day<=a[month]; day++)
                if(day==1 || week==1)sum += 2;
                else sum += 1;
                week = (week+1)%7;
                if(year==2020 && month==10 && day==1)
                    cout<<sum<<'\\n';
                    return 0;
                
            
        
    
    return 0;



第5题 —— 七段码 (15分)


  • 必须要相邻才能发光,也就是所有开着的灯必须是连通的,求合法的方案数。
  • 建图后dfs选边,选完判断连通性统计答案。
  • 答案80。
#include<bits/stdc++.h>
using namespace std;

int fa[10];
int find(int x) return x==fa[x]?x:fa[x]=find(fa[x]); 

int e[10][10], ans;
int vis[10];
void dfs(int cur)
    if(cur == 8)
        for(int i = 1; i <= 7; i++)fa[i] = i;
        for(int i = 1; i <= 7; i++)
            for(int j = 1; j <= 7; j++)
                if(e[i][j] && vis[i] && vis[j])
                    int x = find(i), y = find(j);
                    if(x != y)
                        fa[x] = y;
                    
                
            
        
        int cnt = 0;
        for(int i = 1; i <= 7; i++)
            if(vis[i] && i==fa[i])cnt++;
        
        if(cnt == 1)ans++;
    else
        vis[cur] = 1;
        dfs(cur+1);
        vis[cur] = 0;
        dfs(cur+1);
    


int main()
    //连边建图
    //a b c d e f g
    //1 2 3 4 5 6 7
    e[1][2] = e[1][6] = 1;
    e[2][1] = e[2][7] = e[2][3] = 1;
    e[3][2] = e[3][4] = e[3][7] = 1;
    e[4][3] = e[4][5] = 1;
    e[5][4] = e[5][6] = e[5][7] = 1;
    e[6][1] = e[6][5] = e[6][7] = 1;

    dfs(1);
    cout<<ans<<"\\n";
    return 0;



第6题 —— 成绩统计 (15分)

  • 计算及格率和优秀率,四舍五入输出。
#include<bits/stdc++.h>
using namespace std;

int main()
    int n;  cin>>n;
    int a = 0, b = 0;
    for(int i = 1; i <= n; i++)
        int x;  cin>>x;
        if(x>=60)a++;
        if(x>=85)b++;
    
    printf("%.0lf%%\\n%.0lf%%", round(a*100.0/n), round(b*100.0/n));
    return 0;


第7题 —— 回文日期 (20分)

  • 逐个枚举判断八位数是不是回文是会超时的。
  • 我们可以枚举1000到8999前四位,然后直接构造回文串,根据输入二分查询。
  • 注意闰年和abab格式
//AC
#include<bits/stdc++.h>
using namespace std;
string to_string(int x)
    string res;
    stringstream ss;
    ss<<x;
    ss>>res;
    return res;

int stoi(string x)
    int res;
    stringstream ss;
    ss<<x;
    ss>>res;
    return res;


int a[13] =  0, 31,28,31,30,31,30,31,31,30,31,30,31 ;
int main()
    vector<int>vc, vc2; //存起来
    for(int i = 1000; i <= 9999; i++)//枚举年
        string s = to_string(i);
        for(int j = 3; j >= 0; j--)s+=s[j];//构造abab
        int yy = i;
        int mm = (s[4]-'0')*10+(s[5]-'0');
        int dd = (s[6]-'0')*10+(s[7]-'0');
        int ok;//确保日期合法
        if(mm >= 1 && mm <= 12)
            if((yy%400==0) || (yy%4 == 0 && yy %100!=0))a[2] = 29;
            else a[2] = 28;
            if(a[mm]>=dd)ok = 1;
            else ok = 0;
        else
            ok = 0;
        
        //确保日期是回文
        if(ok)
            vc.push_back(stoi(s));
        
        //确保日期是abab
        if(s[0]==s[2] && s[1]== s[3]);
        else ok = 0;
        if(ok)
            vc2.push_back(stoi(s));
        
    
    int x;  cin>>x;
    int p1 = upper_bound(vc.begin(),vc.end(), x)-vc.begin();
    int p2 = upper_bound(vc2.begin(),vc2.end(), x)-vc2.begin();
    cout<<vc[p1]<<"\\n";
    cout<<vc2[p2]<<"\\n";
    return 0;



第8题 —— 子串分值和 (20分)

  • 暴力不难想到双循环枚举起点和长度,每次计算,50分。
  • 考虑每个字符的贡献,仅在与上一个与之相同的字符中间处产生贡献,直接统计。
#include<bits/stdc++.h>
using namespace std;

int main()
    string s;  cin>>s;
    int z[50] = 0; long long ans = 0;
    for(int i = 0; i < s.size(); i++)
        z[s[i]-'a'] = i+1;
        for(int i = 0; i < 27; i++)
            ans += z[i];
        
    
    cout<<ans<<'\\n';
    return 0;



第9题 —— 平面切分 (25分)

  • 直线相交产生平面个数,是个结论。即第n条直线与前n-1条相交时,如果产生了n-1个交点,那么会多出来n个平面。
  • 开个set维护直线集合,每次暴力枚举求交点,+1累积即可。
#include<bits/stdc++.h>
using namespace std;

set<pair<double, double> >se;//存直线
int calc(double c, double d)//求新产生的交点个数
    set<pair<double, double> >pp;//存交点
    set<pair<double, double> >::iterator i;
    for(i = se.begin(); i != se.end(); i++)
        double a = i->first, b = i->second;
        if(a!=c)
            pair<double, double> t;//求交点
            t.first = (d-b)/(a-c); 
            t.second = c*t.first+d;
            pp.insert(t);
        
    
    return pp.size();


int main()
    int n;  cin>>n;
    int res = 1;
    for(int i = 1; i <= n; i++)
        int a, b;  cin>>a>>b;
        pair<double, double>t;
        t.first = a; t.second = b;
        if(!se.count(t))//没有重复
            res++;
            res += calc(a,b);
        
        se.insert(t);
    
    cout<<res<<'\\n';
    return 0;



第10题 —— 字串排序 (25分)

  • 冒泡排序的交换次数——序列中逆序对的个数。
    在满足交换次数V的前提下,要求最短的序列。
  • 可以按照字典序暴力枚举字符串,然后每次求逆序对判断>=V。

以上是关于第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组思考+总结的主要内容,如果未能解决你的问题,请参考以下文章

2022 第十三届蓝桥杯大赛软件赛省赛(第二场),C/C++ 大学B组题解

第十三届蓝桥杯大赛软件赛省赛(C/C++ 大学B组)

第十三届蓝桥杯大赛软件赛省赛(Java 大学A组)

2020 第十一届蓝桥杯大赛软件赛省赛(第一场),C/C++大学B组题解

2019 第十届蓝桥杯大赛软件赛省赛,C/C++大学B组题解

2019 第十届蓝桥杯大赛软件赛省赛,C/C++大学B组题解