第十二届蓝桥杯省赛C_C++ 大学B组 选择题题解

第十二届蓝桥杯省赛C_C++ 大学B组 选择题题解_第1张图片
计算机基础不扎实,上来就搞内存计算,比赛结束后才知道怎么算,心态崩了(>_<)

#include
using namespace std;
int main(){
     
	long long ans=256*1024*1024/4;//	*8/32==/4
	//1MB=1024KB=1024*1024Byte=8*1024*1024bit
	//256MB=256*1024*1024*8bit
	//一个二进制整数32位(bit),256MB转换为bit后除以32即是答案 
	cout<<ans<<endl;
	return 0;
}

答案

67108864

第十二届蓝桥杯省赛C_C++ 大学B组 选择题题解_第2张图片
打卡题,记得减一

#include
using namespace std;
int main(){
     
	long long card[10],f=0;
	for(int i=0;i<=9;i++){
     
		card[i]=2021;
	}
	for(long long i=1;;i++){
     
		long long k=i;
		while(k){
     
			card[k%10]--;
			if(card[k%10]<0){
     
				cout<<i-1<<endl;
				f=1;
				break;
			}
			k/=10;
		}
		if(f==1)break;
	}
}

答案

3181

第十二届蓝桥杯省赛C_C++ 大学B组 选择题题解_第3张图片
计算几何???分治???暂时想不出怎么做

//暂时不写

答案

40257

第十二届蓝桥杯省赛C_C++ 大学B组 选择题题解_第4张图片
一开始尝试暴力,后面想先拆出一个因数再暴力,想不到质因数组合(质因数分解+dfs组合+map查重)可以解决(比赛还是错了),还是头脑太简单啦。

#include
#include
#include
#include
using namespace std;
long long a=2021041820210418,ans=0; 
int c=0;
long long a1[100000];
map<string,int> v;
void dfs(int k,long long p1,long long p2,long long p3){
     
	if(k==c){
     
		string str;//利用map查重 
		while(p1){
     
			str+=char(p1%10);
			p1/=10;
		}
		while(p2){
     
			str+=char(p2%10);
			p2/=10;
		}
		while(p3){
     
			str+=char(p3%10);
			p3/=10;
		}
		if(v[str]==0)ans++;
		v[str]=1;
		return;
	}
	dfs(k+1,p1*a1[k],p2,p3); 
	dfs(k+1,p1,p2*a1[k],p3);
	dfs(k+1,p1,p2,p3*a1[k]);
}
int main(){
     
	for(long long i=2;a!=1;i++){
     
		if(a%i==0){
     			//求质因数 
			a1[c]=i;
			a/=i;
			c++;
			i--;
		}
	}
	dfs(0,1,1,1);
	cout<<ans<<endl;
} 

答案

2430

第十二届蓝桥杯省赛C_C++ 大学B组 选择题题解_第5张图片
gcd+Dijkstra算法,可快速解决,但是写起来太费劲了(写熟练了除外),建议使用Floyd算法更好写,终于捞到分了。

#include
#include
#include
#define inf 999999999
using namespace std;
long long gcd(long long a,long long b){
     	//辗转相除法
	long long n1=a,n2=b;
	while(b){
     
		long long c=a%b;
		a=b;
		b=c;
	} 
	return n1*n2/a;
}
int main(){
     
	long long a[2022],v[2022]={
     0};
	for(int i=2;i<=2021;i++){
     
		a[i]=inf;
	}
	a[1]=0;
	int ii=1;
	while(1){
     
		long long maxx=inf;
		for(int i=1;i<=2021;i++){
     
			if(v[i]==0&&a[i]<maxx){
     
				ii=i;
				maxx=a[i];
			}
		}
		if(maxx==inf)break;
		v[ii]=1;
		cout<<ii<<endl;
		for(int i=ii-21;i<=ii+21;i++){
     
			if(i>0){
     
				if(v[i]==0&&a[i]>a[ii]+gcd(i,ii)){
     
					a[i]=a[ii]+gcd(i,ii);
				}
			}
		}
	}
	cout<<a[2021]<<endl;
}

答案

10266837

总结

第一次参加蓝桥杯,比刷的往届题难一些,填空题才得20分,但是还是水进国赛啦(^w^)

你可能感兴趣的:(c++,算法)