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

题目

A.空间

题目描述

2021第十二届蓝桥杯省赛B组原题答案及总结_第1张图片

解题思路

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

B.卡片

题目描述

2021第十二届蓝桥杯省赛B组原题答案及总结_第2张图片

解题思路

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

C.直线

题目描述

2021第十二届蓝桥杯省赛B组原题答案及总结_第3张图片

解题思路


D.货物摆放

题目描述

2021第十二届蓝桥杯省赛B组原题答案及总结_第4张图片

解题思路

网友的思路

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

代码展示

#include
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.路径

题目描述

2021第十二届蓝桥杯省赛B组原题答案及总结_第5张图片

解题思路

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

代码展示

#include
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.时间显示

题目描述

2021第十二届蓝桥杯省赛B组原题答案及总结_第6张图片

解题思路

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

G.砝码称重

题目描述

二分???

解题思路


H.杨辉三角形

题目描述

解题思路


I.双向路径

题目描述

解题思路


J.括号序列

题目描述

解题思路


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

你可能感兴趣的:(刷题笔记,算法,数据结构,动态规划,蓝桥杯)