第十五(15)届蓝桥杯模拟赛题解+AC代码(第二期)

纵有千古,横有八荒,前途似海,来日方长----梁启超

My friends,觉得写的不错,记得点赞,关注,收藏!!!

 

题目1:

第十五(15)届蓝桥杯模拟赛题解+AC代码(第二期)_第1张图片

思路:

1.先算出一行总的像素30*36,之后改为每个字宽10个像素,用一行总的像素/10,30*36/10,等于多少呢?

答案:108

题目2:

第十五(15)届蓝桥杯模拟赛题解+AC代码(第二期)_第2张图片

思路:

1.一个for循环,枚举2023次即可

2.假若枚举次数过多,可以用快速幂优化,不过这里是填空,不考虑时间复杂度

AC_Code:C++

#include

using namespace std;

int main()
{
    int ans=1;
    for(int i=0;i<2023;i++)	ans=ans*2%1000;
    cout<

答案:608

题目3:

第十五(15)届蓝桥杯模拟赛题解+AC代码(第二期)_第3张图片

思路:

1.从1开始枚举,对每个数转化为二进制与八进制,看数位相加是否相等,相等个数++

2.直到第23个数转化为二进制与八进制数位相等,输出答案结束程序

3.十进制转其他进制数时,边除边取余数即可

AC_Code:C++

#include 
#include

using namespace std;

//转化为二进制,统计数位
int get2(int n){
	int res=0;
	while(n)	res+=n%2,n/=2;
	return res;
}

//转化为八进制,统计数位
int get8(int n){
	int res=0;
	while(n)	res+=n%8,n/=8;
	return res;
}

int main()
{
    int cnt=0;	//记录第几个数,二八进制数位和相等
    for(int i=1;;i++){
	 	if(get2(i)==get8(i)){
			cnt++;
			if(cnt==23){
				cout<

答案:4169

题目4:

第十五(15)届蓝桥杯模拟赛题解+AC代码(第二期)_第4张图片

input:

393353 901440 123481 850930 423154 240461
373746 232926 396677 486579 744860 468782
941389 777714 992588 343292 385198 876426
483857 241899 544851 647930 772403 109929
882745 372491 877710 340000 659788 658675
296521 491295 609764 718967 842000 670302

思路:

约数:n%m==0,m则是n的约数

1.统计每个数的约数个数,找出最大值即可

2.求一个数x的约数个数,i从1枚举到x,看有多少个x%i==0,

AC_Code:C++

#include 

using namespace std;

int n;
int a[47];

int get(int n){
	int cnt=0;
	for(int i=1;i<=n;i++)
		if(n%i==0) cnt++;
		
	//一个小优化,不过填空题还是怎么快怎么来吧,	
//	for(int i=1;i<=n/i;i++)
//		if(n%i==0){
//			cnt++;	
//			if(i!=n/i)	cnt++;
//		}
		
	return cnt;
}

int main()
{
	n=36;
    for(int i=0;i>a[i];
    
    int mx=-1,idx=-1;	//记录约数个数的最大值,与其对应的下标
    for(int i=0;imx){
			mx=cnt;
			idx=i;
		}
	}
	
	cout<

答案:901440

题目5:

第十五(15)届蓝桥杯模拟赛题解+AC代码(第二期)_第5张图片

input:

0000100010000001101010101001001100000011
0101111001111101110111100000101010011111
1000010000011101010110000000001011010100
0110101010110000000101100100000101001001
0000011010100000111111001101100010101001
0110000110000000110100000000010010100011
0100110010000110000000100010000101110000
0010011010100110001111001101100110100010
1111000111101000001110010001001011101101
0011110100011000000001101001101110100001
0000000101011000010011111001010011011100
0000100000011001000100101000111011101100
0010110000001000001010100011000010100011
0110110000100011011010011010001101011011
0000100100000001010000101100000000000010
0011001000001000000010011001100101000110
1110101000011000000100011001001100111010
0000100100111000001101001000001010010001
0100010010000110100001100000110111110101
1000001001100010011001111101011001110001
0000000010100101000000111100110010101101
0010110101001100000100000010000010110011
0000011101001001000111011000100111010100
0010001100100000011000101011000000010101
1001111010010110011010101110000000101110
0110011101000010100001000101001001100010
1101000000010010011001000100110010000101
1001100010100010000100000101111111111100
1001011010101100001000000011000110110000
0011000100011000010111101000101110110001

思路:dfs/bfs

1本题的意思其实就是,在第一行第一列等于0的字符,跑一遍dfs/bfs,染色染成2,其实也是联通块的问题,也称洪水灌溉算法。

2.最后统计字符2的个数为多少。

AC_Code:C++

#include 
#include

using namespace std;
typedef pairPII;
#define x first
#define y second

int const N=57;


int T;
int n=30,m=40;
char s[N][N];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};

void dfs(int x,int y){
	s[x][y]='2';
	
	for(int i=0;i<4;i++){
		int bx=dx[i]+x,by=dy[i]+y;
		if(bx<1||by<1||bx>n||by>m)	continue;
		if(s[bx][by]=='0')	dfs(bx,by);
	}
}

void bfs(int sx,int sy){
	queueq;
	q.push({sx,sy});
	s[sx][sy]='2';
	
	while(q.size()){
		PII t=q.front();	q.pop();
		
		for(int i=0;i<4;i++){
			int bx=dx[i]+t.x,by=dy[i]+t.y;
			if(bx<1||by<1||bx>n||by>m)	continue;
			if(s[bx][by]=='0'){
				s[bx][by]='2';
				q.push({bx,by});
			}	
		}
	}
}

int main(){
    for(int i=1;i<=n;i++)	scanf("%s",s[i]+1);
    
    //dfs
    for(int j=1;j<=m;j++) 
		if(s[1][j]=='0') dfs(1,j);
    for(int i=1;i<=n;i++) 
		if(s[i][1]=='0') dfs(i,1);
	
	//bfs
//	for(int j=1;j<=m;j++) 
//		if(s[1][j]=='0') bfs(1,j);
//    for(int i=1;i<=n;i++) 
//		if(s[i][1]=='0') bfs(i,1);
    
    //统计字符2的数量
    int ans=0;
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++)	
    		ans+=s[i][j]=='2';
    
    cout<

答案:591

题目6:

第十五(15)届蓝桥杯模拟赛题解+AC代码(第二期)_第6张图片

思路:

1.最高两位不为0,那么可以直接输出次高位到个位,最后输出最高一位

AC_Code:C++

#include 

using namespace std;

string s;

int main()
{
    cin>>s;
    for(int i=1;i<6;i++)	cout<

题目7:

第十五(15)届蓝桥杯模拟赛题解+AC代码(第二期)_第7张图片

思路:

1.统计5个元音字母中最后一次出现的字母,我们可以倒序枚举,那么首次出现的元音字母就答案(题目保证了一定有一个元音字母)

AC_Code:C++

#include 

using namespace std;

string s;

void solve(){
    cin>>s;
    for(int i=s.size()-1;i>0;i--){
		if(s[i]=='a'){
			cout<

题目8:

第十五(15)届蓝桥杯模拟赛题解+AC代码(第二期)_第8张图片

思路:

1.拆出每一位来,(除0外)相乘即可,直到小于10

2.记得开long long 

AC_Code:C++

#include 

using namespace std;
typedef long long LL;

int main(){
    LL n;	cin>>n;
    
    while(n>=10){
		LL temp=n;
		LL next_n=1;
		
		//拆出每一位相乘
		while(temp){
			if(temp%10>0)	next_n*=temp%10;
			temp/=10;
		}
		
		n=next_n;
		printf("%lld\n",n);
	}
	
	return 0;
} 

题目9:

第十五(15)届蓝桥杯模拟赛题解+AC代码(第二期)_第9张图片

input:

3 4
3 6 5 5
2 4 3 5
7 8 3 8
3 2

output:

5

第十五(15)届蓝桥杯模拟赛题解+AC代码(第二期)_第10张图片

思路:dfs/bfs

1.联通块问题,不过联通的条件是最大公约数大于1,dfs/bfs都可以行,此算法也称洪水灌溉算法

AC_Code:C++

#include 
#include 

using namespace std;

typedef long long LL;
typedef pairPII;

#define x first
#define y second


int const N=1007;


int T;
int n,m;
int sx,sy;
int a[N][N];
bool vis[N][N];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};

int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}

int dfs(int x,int y){
	vis[x][y]=1;
	
	int res=1;
	for(int i=0;i<4;i++){
		int bx=dx[i]+x,by=dy[i]+y;
		if(bx<1||by<1||bx>n||by>m||vis[bx][by])	continue;
		if(gcd(a[x][y],a[bx][by])==1)	continue;
		res+=dfs(bx,by);
	}
	
	return res;
}

int bfs(int sx,int sy){
	queueq;	q.push({sx,sy});
	int res=0;
	while(q.size()){
		PII t=q.front();	q.pop();
		res++;
		
		for(int i=0;i<4;i++){
			int bx=dx[i]+t.x,by=dy[i]+t.y;
			if(bx<1||by<1||bx>n||by>m||vis[bx][by])	continue;
			if(gcd(a[t.x][t.y],a[bx][by])==1)	continue;
			q.push({bx,by});
			vis[bx][by]=true;
		}
		
	}
	
	return res;
}


int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++)
    		scanf("%d",&a[i][j]);
    
    scanf("%d%d",&sx,&sy);
    
    vis[sx][sy]=true;
    
    //cout<

题目10:

第十五(15)届蓝桥杯模拟赛题解+AC代码(第二期)_第11张图片

思路:

1.找出一个长为k的区间和的最大值,区间长度确定,可以直接用滑动窗口,

2.也可以枚举起点,用前缀和o(1)计算区间和

AC_Code:C++

#include 

using namespace std;

typedef long long LL;

int const N=1e5+7;

int n,k;
int a[N];
LL pre[N];

int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++){
		scanf("%d",a+i);
		pre[i]=pre[i-1]+a[i];
	}
	
	//前缀和+枚举起点
//	LL ans=-1;
//	for(int i=1;i+k-1<=n;i++)
//		ans=max(ans,pre[i+k-1]-pre[i-1]);
	
	//滑动窗口
	LL sum=0,ans=-1;
	for(int i=1;i<=n;i++){
		sum+=a[i];
		if(i>k)	sum-=a[i-k];
		if(i>=k)	ans=max(ans,sum);
	}
	
	cout<

 

My friends,觉得写的不错,不要忘记点赞,关注,收藏哦!!!

 

 

 

你可能感兴趣的:(蓝桥杯&数据结构与算法,蓝桥杯,职场和发展)