2021第十二届蓝桥杯大赛软件赛省赛C++ C组真题题解

==============================
2019-2021蓝桥杯C++ C组真题题解:
2019第十届蓝桥杯大赛软件类省赛C++ C组真题题解
2020第十一届蓝桥杯大赛软件类省赛第二场C++ C组真题题解
2021第十二届蓝桥杯大赛软件赛省赛C++ C组真题题解

==============================

试题A:ASC(5分)

在这里插入图片描述

题目分析:
将’L’字符直接赋值给int就可以输出数字了
题目代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int c='L';
	cout<<c<<endl;
	return 0;
}

题目答案:

76

试题B:空间(5分)

在这里插入图片描述

题目分析:
1MB=1024*1024B,1B=8位
题目代码:

#include <iostream>
using namespace std;
int main()
{
	cout<<256*1024*1024/4<<endl;	
}

题目答案:

67108864

试题C:卡片(10分)

在这里插入图片描述

题目分析:
因为从1开始,所以1是用到最多的卡片,我们可以从1枚举,直到有2021个1
题目代码:

#include <iostream>
using namespace std;
int tot_1=2021;
void cal(int i)
{
	while(i>0){
		if(i%10==1)tot_1--;
		i=i/10;
	}
}
int main()
{
	int i=1;
	while(1){
		cal(i);
		if(tot_1<=0)break;
		i++;
	}
	cout<<"tot_1:"<<tot_1<<" i:"<<i<<endl;
	return 0;
}

题目答案:

3181

试题D:相乘(10分)

在这里插入图片描述

题目分析:
枚举即可
题目代码:

#include <bits/stdc++.h>
using namespace std;
#define NUM 1000000007
#define RES 999999999
int main()
{
	for(long long i=1;i<=NUM;i++)
	{
		if((i*2021)%NUM==RES)cout<<i<<endl;
	}
	cout<<"0"<<endl;
	return 0;
}

题目答案:

17812964

试题E:路径(15分)

在这里插入图片描述

题目分析:
方法一:比较简单,相当于枚举的方法
从1到2021进行寻找每个的最短的路径,我想的是多循环几次看结果的变化,但是没想到第一次就是正确的结果
注:n*i/__gcd(n,i) 是求最小公倍数
细节参考:C++ 一行代码解决最大公约数和最小公倍数
题目代码:

#include <bits/stdc++.h>
using namespace std;
int num[2022];
void fun(int n)//寻找一个位置的最短路径(更新)
{
	int left=n-21,right=n+21;
	if(n-21<=0)
	{
		left=1;
	}else if(n+21>2021)
	{
		right=2021;
	}
	
	for(int i=left;i<=right;i++)
	{
		num[n]=min(n*i/__gcd(n,i)+num[i],num[n]);	
	}
}
int main()
{
	for(int i=1;i<=2021;i++)num[i]=100000000;//进行初始化
	num[1]=0;
	for(int j=1;j<10;j++)//循环10次看结果
	{
		for(int i=1;i<=2021;i++)
		{
			fun(i);
		}
		cout<<num[2021]<<endl;//查看结果
	}
}

题目答案:

10266837

试题F:时间显示(15分)

在这里插入图片描述
在这里插入图片描述

题目分析:
只要记清时间的换算单位即可
题目代码:

#include <iostream>
using namespace std;
#define Day 86400000
int main()
{
  long int time;
  cin>>time;
  time=time%Day;
  int Hour,minute,second;
  Hour=time/(60*60*1000);
  time=time%(60*60*1000);
  minute=time/(60*1000);
  time=time%(60*1000);
  second=time/1000;
  printf("%02d:%02d:%02d",Hour,minute,second);
  return 0;
}

试题G:最少砝码(20分)

在这里插入图片描述
在这里插入图片描述

题目分析:
题目代码:
题目答案:

试题H:杨辉三角形(20分)

在这里插入图片描述
在这里插入图片描述

题目分析:
题目代码:
题目答案:

试题I:左孩子右孩子(25分)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目分析:
题目代码:
题目答案:

试题J:括号序列(25分)

在这里插入图片描述

题目分析:
题目代码:
题目答案:

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗吧!骚年!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值