Advertisement

蓝桥杯(2021第十二届C/C++真题[省赛][B组])

阅读量:

卡片

习题链接:

思路: 首先建立一个对应卡片号的数组,并将每个卡片所拥有的数量存储其中。接着对每位数字进行分解处理。随后检查当前卡片的数量是否为零。如果当前卡片的数量等于零,则表示此时无法继续构成任何数字。因此,在这种情况下应当输出当前得到的结果。

题解:

复制代码
 #include<iostream>

    
 using namespace std;
    
 int n[10],num;
    
 int main()
    
 {
    
 	for(int i=0;i<=9;i++) n[i]=2021;
    
 	for(int i=1;i<=20210;i++)
    
 	{
    
 		num=i;
    
 		while(num)
    
 		{
    
 			if(n[num%10]==0)
    
 			{
    
 				cout<<i-1;//特别注意需要减1!!!!因为这次循环的数已经无法构成!!
    
 				return 0;
    
 			}
    
 			else
    
 			{
    
 				n[num%10]--;
    
 				num/=10;
    
 			}
    
 		}
    
 	}
    
 	return 0;
    
 }
    
    
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/or2NBpiS1n8yawGmKQhd4eWqczjI.png)

答案:3181


直线

习题链接1.直线 - 蓝桥云课 (lanqiao.cn)

思路: 两点式直线方程: (y-y2)/ (y1-y2) = (x-x2)/ (x1-x2)

(y1-y2) * x +(x2-x1) * y +( x1 * y2 - x2 * y1)=0

将所有坐标存储起来,并对每个坐标组执行操作以计算出直线方程中的系数A、B、C;随后并用最大公约数对这些系数进行约分;接着通过集合运算去除重复项;最后再加入与x轴和y轴垂直的数值。

题解:

复制代码
 #include<iostream>

    
 #include<set>
    
 using namespace std;
    
 set<pair<pair<double,double>,double> > s;//存斜率和截距 
    
 int gcd(int x,int y)//求最大公约数 
    
 {
    
 	if(y==0) return x;
    
 	return gcd(y,x%y);
    
 }
    
 int main()
    
 {
    
 	for(int x1=1;x1<=20;x1++)
    
 	{
    
 		for(int y1=1;y1<=21;y1++)
    
 		{
    
 			for(int x2=1;x2<=20;x2++)
    
 			{
    
 				for(int y2=1;y2<=21;y2++)
    
 				{
    
 					if(x1!=x2&&y1!=y2)
    
 					{
    
 						double a=x2-x1;
    
 						double b=y2-y1;
    
 						double c=x1*y2-x2*y1;
    
 						double t=gcd(gcd(a,b),c);
    
 						s.insert({{a/t,b/t},c/t});
    
 					}
    
 				} 
    
 			}
    
 		}
    
 	}
    
 	cout<<s.size()+20+21; 
    
 	return 0;
    
 }
    
    
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/Fv1MyeldjS2Nto67Abrniz5qw4YL.png)

答案:40257


货物摆放

练习题连接:[练习题 - 蓝桥云课 (lanqiao.cn)](https://www.lanqiao.cn/problems/1463/learning/?page=1&first_category_id=1&name=货物摆�� BE)

思路:通过对实例的分析总结出规律。在解决该问题时,我们首先计算长宽高三个维度的数据相乘总和等于n。然后对这三个参数进行分解循环处理,并引入条件判断机制优化算法的时间复杂度。最后确保i、j、k满足i≤j≤k的顺序关系

题解:

复制代码
 #include<iostream>

    
 using namespace std;
    
 typedef long long ll;
    
 ll n=2021041820210418;
    
 ll i,j,k;
    
 ll sum;
    
 int main()
    
 {
    
 	for(i=1;i*i*i<=n;i++)
    
 	{
    
 		if(n%i==0)
    
 		{
    
 			for(j=i;j*j*i<=n;j++)
    
 			{
    
 				if(n/i%j==0)
    
 				{
    
 					k=n/i/j;
    
 					if(i==j&&j==k) sum++;
    
 					else if(i==j||i==k||j==k) sum+=3;
    
 					else sum+=6;
    
 				}
    
 			}
    
 		}
    
 	}
    
 	cout<<sum;
    
 	return 0;
    
 }
    
    
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/31AaQfdj5HS4MoR0LUiDvbeYp8Em.png)

答案:2430


路径

习题学习入口 :课程概览 - 蓝桥云课 (lanqiao.cn)

思路: floyd算法

题解:

复制代码
 #include<iostream>

    
 #include<cstring>
    
 #include<cmath>
    
 using namespace std;
    
 typedef long long ll;
    
 #define INT 0x3f3f3f3f
    
 ll s[2022][2022];
    
 int gcd(int x, int y)//最大公约数
    
 {
    
 	if (y == 0)
    
 		return x;
    
 	return gcd(y, x % y);
    
 }
    
 int lcm(int x, int y)//最小公倍数
    
 {
    
 	int z = x * y;
    
 	return z / gcd(x, y);
    
 }
    
 int main()
    
 {
    
 	//初始化
    
 	memset(s, INT, sizeof(s));
    
 	for (int i = 1; i <= 2021; i++)
    
 	{
    
 		for (int j = 1; j <= 2021; j++)
    
 		{
    
 			if (i == j) s[i][j] = 0;
    
 			else {
    
 				if (abs(i - j) <= 21)//判断差的绝对值是否小于等于21
    
 				{
    
 					s[i][j] = lcm(i, j);
    
 				}
    
 			}
    
 		}
    
 	}
    
 //floyd算法核心
    
 	for (int k = 1; k <= 2021; k++)
    
 	{
    
 		for (int i = 1; i <= 2021; i++)
    
 		{
    
 			for (int j = 1; j <= 2021; j++)
    
 			{
    
 				if (s[i][j] > s[i][k] + s[k][j])
    
 				{
    
 					s[i][j] = s[i][k] + s[k][j];
    
 				}
    
 			}
    
 		}
    
 	}
    
 	cout << s[1][2021];
    
 	return 0;
    
 }
    
    
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/PXIw7oxGz03WbOmeTviD8VNAK1uB.png)

答案:10266837


空间

练习题链接

思路:

Bit:bit or b, binary digit, represents the smallest unit of data in computing
Byte: Byte or B
1MB = 1024kB, 1kB = 1024b, 1b = 1Byte = 8bit

题解:

复制代码
 #include<iostream>

    
 using namespace std;
    
 int main()
    
 {
    
 	cout<<(long long)256*1024*1024*8/32;
    
 	return 0;
    
 }
    
    
    
    
    cpp

答案:67108864


砝码称重

输入样例

复制代码
 3

    
 1 4 6
    
    
    
    
    cpp

输出样例

复制代码
    10
    
    cpp

习题页面1. 砝码称重 - 蓝桥云课 (lanqiao.cn)

**思路:

**

题解:

复制代码
 #include<iostream>

    
 #include<algorithm> 
    
 using namespace std;
    
 int N;
    
 int sum,ans;//总重,总数 
    
 int w[105];//每个对应重量 
    
 int f[105][105000];//前i个物品,重量为j
    
 //可以秤出重量为1,不可以为0 
    
 int main()
    
 {
    
 	cin>>N;
    
 	for(int i=1;i<=N;i++)
    
 	{
    
 		cin>>w[i];
    
 		sum+=w[i];
    
 	}
    
 	for(int i=1;i<=N;i++)
    
 		for(int j=1;j<=sum;j++)//遍历所有重量 
    
 		{
    
 			f[i][j]=f[i-1][j];//继承前一个状态
    
 			if(f[i][j]==0)//继承后不行 
    
 			{
    
 				if(j==w[i]) f[i][j]=1;//所需重量恰为第i个砝码 
    
 				if(f[i-1][j+w[i]]==1) f[i][j]=1;//前i-1能称出j+a[i]重量,把第i个放到另一侧 
    
 				if(f[i-1][abs(j-w[i])]==1) f[i][j]=1;// 前i-1能称出abs(j-a[i])重量,把第i个放到同侧
    
 			}
    
 		}
    
 	for(int i=1;i<=sum;i++)
    
 	{
    
 		if(f[N][i]==1) ans++;
    
 	}
    
 	cout<<ans<<endl;
    
 	return 0;
    
 }
    
    
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/tUBSoTF4L3e2dxnwkQNWc1pDCaGr.png)

时间显示

输入样例1

复制代码
    46800999
    
    cpp

输出样例1

复制代码
    13:00:00
    
    cpp

输入样例2

复制代码
    1618708103123
    
    cpp

输出样例2

复制代码
    01:08:23
    
    cpp

样例说明:

习题页面:蓝桥云课(lanqiao.com

题解:

复制代码
 #include <iostream>

    
 using namespace std;
    
 int main()
    
 {
    
   long long int h;
    
   cin >> h;
    
   int hh,mm,ss;
    
   h = h%(24*60*60*1000);//天
    
   hh = h/(60*60*1000)%24;//时 
    
   mm = h/(60*1000)%60;//分 
    
   ss = h/(1000)%60;//秒 
    
   printf("%02d:%02d:%02d\n",hh,mm,ss);
    
   return 0;
    
 }
    
    
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/itJalecVNnS5svq1frwL9d0CoODj.png)

杨辉三角

输入样例

复制代码
    6

输出样例

复制代码
    13

样例说明:

**

**

习题列表 :[第十三章 杨辉三角形(蓝桥云课)](https://www.lanqiao.cn/problems/1457/learning/?page=2&first_category_id=1&status=1&second_category_id=3&tags=2021 "第十三章 杨辉三角形(蓝桥云课) lanqiao.cn )

学习内容:第十二届蓝桥杯C++ B组详细解析

题解:

复制代码
 #include<iostream>

    
 #include<algorithm>
    
 #include<cstring>
    
 using namespace std;
    
 typedef long long ll;
    
 ll n;
    
 ll c(int a,int b)
    
 {
    
 	ll res=1;
    
 	for(int i=a,j=1;j<=b;i--,j++)
    
 	{
    
 		res=res*i/j;
    
 		if(res>n) return res;
    
 	}
    
 	return res;
    
 }
    
 bool check(int k)
    
 {
    
 	ll l=k*2,r=n;
    
 	while(l<r)
    
 	{
    
 		ll mid=l+r>>1;
    
 		if(c(mid,k)>=n) r=mid;
    
 		else l=mid+1;
    
 	}
    
 	if(c(r,k)!=n) return false;
    
 	cout<<r*(r+1)/2+k+1;
    
 	return true;
    
 }
    
 int main()
    
 {
    
 	cin>>n;
    
 	for(int i=16;;i--)
    
 		if(check(i))
    
 			break;
    
 	return 0;
    
 }
    
    
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/vIuPXtVg29wZamFEYMoCTBL5qKhb.png)

双向排序

输入样例

复制代码
 3 3

    
 0 3
    
 1 2
    
 0 2
    
    
    
    
    cpp

输出样例

复制代码
    3 1 2
    
    cpp

样例说明:

**

**

习题列表双层排序 - 蓝桥云课(lanqiao.cn)

第十二届蓝桥杯C++ B组详细解析(二)_哔哩哔哩_哔哩哔哩

解答思路:基于对问题的深入分析与研究的基础上提出了一种高效的解决策略


括号序列

输入样例

复制代码
    ((()
    
    cpp

输出样例

复制代码
    5
    
    cpp

**样例说明:

**

练习题链接:蓝桥云课(lanqiao.cn)中的'0括号序列'问题页面中包含相关学习内容,请访问该页面进行练习。

学习重点:第十二届蓝桥杯C++ B组的讲解视频(第三讲)哔哩哔哩 第十二届蓝桥杯C++ B组讲解(三)

解答:第十二届蓝桥杯省级比赛C++B组J组题目括号序列问题的详细解析与解决方案

全部评论 (0)

还没有任何评论哟~