2021第十二届蓝桥杯省赛B组原题答案及总结

题目

A.空间

题目描述

在这里插入图片描述

解题思路
1.我们可以把256MB换算成字节=>256*1024*1024*8/32
2.
答案:67,108,864
======
需要注意的是如果编程计算的话,int型结果会是-67,108,864,要把 *8/32变成/4

B.卡片

题目描述

在这里插入图片描述

解题思路
1.一开始看这题懵了一瞬间,然后意识到只是第2题,肯定不会考太难的知识点~~
2.然后自然而然地想到了暴力解法,遍历1~n,生成每个数后,判断剩余的卡片数num[i](0<=i<=9)是否<0,如果num[i]为负数,就说明卡牌数不足以拼凑出当前这个数;
3.输出结果减去1就是我们能拼成的最大数;
答案:3181
======
想到暴力法的原因还有一个,根据过去几年的蓝桥杯真题,都会出遍历数位的题~~~~~

C.直线

题目描述

在这里插入图片描述

解题思路

D.货物摆放

题目描述

在这里插入图片描述

解题思路

网友的思路

1.因数分解
把n的所有因数都找出来,存储;然后三重循环遍历暴力找~~~~
答案
2430

代码展示

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5;
/*

*/
vector<ll>num;
int main(){
	ll n=2021041820210418;
	for(ll i=1;i*i<=n;i++){
		if(n%i==0){
			num.push_back(i);
			num.push_back(n/i);
		}
	} 
	int l=num.size();
	//if()
	int ans=0;
	for(int i=0;i<l;i++){
		for(int j=0;j<l;j++){
			for(int k=0;k<l;k++){
				if(num[i]*num[j]*num[k]==n){
					ans++;
				}
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

考试时候的思路

1.令Get(x)返回n=x时的方案数;
2.找规律发现,把x分解为互质的两个数a,b,那么Get(a)*Get(b)=Get(x)
	//规律不一定对,但是我验证的所有数据都满足
3.然后2021041820210418可分解为20210418*100000001;
	暴力求Get(20210418)=270,Get(100000001)=9;
	那么结果就是2430;

E.路径

题目描述

在这里插入图片描述

解题思路
1.第一遍看的时候,以为是填空的最后一题,肯定很难,加上数据也挺大,就没敢写;
2.在写完后面的题之后,再看了一遍,发现就是简单的建图+最短路;
3.关于最短路的求解,一开始我是用的dijkstra(),发现不行,顿时慌了;于是就硬着头皮上Floyd算法;
答案:10266837

代码展示

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF=1e10;
/*

*/
ll G[3000][3000];
ll dis[3000];
bool vis[3000];
void Dijkstra(){
	dis[1]=0;
	for(int i=0;i<2021;i++){
		ll minnum=INF,u=-1;
		for(int j=1;j<=2021;j++){
			if(!vis[j]&&G[1][j]<minnum){
				minnum=G[1][j];
				u=j;
			}
		}
		if(u==-1)return;
		vis[u]=1;
		for(int j=1;j<=2021;j++){
			if(!vis[j]&&G[u][j]!=INF&&dis[j]>dis[u]+G[u][j]){
				dis[j]=dis[u]+G[u][j];
			}
		}
	}
}
void Floyd(){
	for(int i=1;i<=2021;i++){
		for(int j=1;j<=2021;j++){
			for(int k=1;k<=2021;k++){
				G[i][k]=min(G[i][k],G[i][j]+G[j][k]);
			}
		} 
	}
}
int main(){
	fill(G[0],G[0]+3000*3000,INF);
	fill(dis,dis+3000,INF);
	for(int i=1;i<=2021;i++){
		for(int j=0;j<=21;j++){
			ll f=i*(i+j)/__gcd(i,i+j);
			G[i][i+j]=f;
			G[i+j][i]=f;
		}
			
	}
//	Dijkstra();
//还不知道Dijkstra为啥不行~~~ 
	Floyd();
	cout<<G[1][2021]<<endl;
	return 0;
}

F.时间显示

题目描述

在这里插入图片描述

解题思路
简单的模拟题,由于不需要考虑年月,所以直接求余24*60*60*1000(一天的时间)
剩下的就很容易了~~~~

G.砝码称重

题目描述
二分???
解题思路

H.杨辉三角形

题目描述
解题思路

I.双向路径

题目描述
解题思路

J.括号序列

题目描述
解题思路

https://blog.csdn.net/FallenSQL/article/details/115828657

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

高冷小伙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值