M蓝桥杯练习

第十一届 省 A

第一题:门牌制作

答案:624

#include<iostream>
#include <sstream>
#include<stdlib.h>
#include<stdio.h>

using namespace std; 

int main(){
    
    
	int s=0;
	for(int i=1;i<=2020;++i)
	{
    
    
		int t=i;
		while(t)
		{
    
    
			if(t%10==2)s++;
			t/=10;
		}
	}
	cout<<s;
	return 0;
}


第二题:既约分数

答案:2481215

#include<iostream>
#include <sstream>
#include<stdlib.h>
#include<stdio.h>

using namespace std; 
int gcd(int m,int n)
{
    
    
	return n==0?m:gcd(n,m%n);
}

int main(){
    
    
	int s=0;
	for(int i=1;i<=2020;++i)
	{
    
    
		for(int j=1;j<=i;++j)
		{
    
    
			if(gcd(i,j)==1)
			{
    
    
				s++;
			}
		}
	}
	s*=2;
	s-=1;//1/1倒数和自己相等所以计算了两次 
	cout<<s;
	return 0;
}


更直接的模拟:

#include<iostream>
#include <sstream>
#include<stdlib.h>
#include<stdio.h>

using namespace std; 
int gcd(int m,int n)
{
    
    
	return n==0?m:gcd(n,m%n);
}

int main(){
    
    
	int s=0;
	for(int i=1;i<=2020;++i)
	{
    
    
		for(int j=1;j<=2020;++j)
		{
    
    
			if(gcd(i,j)==1)
			{
    
    
				s++;
			}
		}
	}
	
	cout<<s;
	return 0;
}

第三题:蛇形填数

答案:761

#include<iostream>
#include <sstream>
#include<stdlib.h>
#include<stdio.h>

using namespace std; 


int a[45][45];
int t=2;
	int i=1;int j=1;

int main(){
    
    
	a[1][1]=1;
	bool flag=true;
	
	while(t)
	{
    
    
		if(i==1)
		{
    
    
			if(flag)
			{
    
    
				j++;
				flag=false;
			}
			else {
    
    
				i++;j--;
			}
		}
		else
		if(j==1)
		{
    
    
			if(flag==false){
    
    
				i++;
				flag=true;
			}
			else {
    
    
				i--;j++;
			}
		}
		else 
		{
    
    
			if(flag==false)
			{
    
    
				i++;j--;
			}
			else 
			{
    
    
				i--;j++;
			}
		}
		a[i][j]=t++;
		if(i==20&&j==20)
		{
    
    
			break;
		}
		
	}
	cout<<"ans="<<a[20][20]<<endl;
	for(int i=1;i<=40;i++)
	{
    
    
		for(int j=1;j<=41-i;++j)
		{
    
    
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}


第四题:7段码

#include <iostream>

using namespace std;

int v[10][10];
int a[7];
int b[7];
int ans;

int find(int x)
{
    
    
	int t=x;
	while(x!=b[x])
	{
    
    
		x=b[x];
	}
	return b[t]=x;
}
void unionn(int x,int y)
{
    
    
	int fx=find(x);
	int fy=find(y);
	b[fx]=fy;
}

void pun()
{
    
    
	for(int i=0;i<7;++i)b[i]=i;
	for(int i=0;i<7;++i){
    
    
		for(int j=0;j<7;++j)
		{
    
    
			if(a[i]&&a[j]&&(v[i][j]||v[j][i]))
			{
    
    
				unionn(i,j);
			}
		}
	}
	int temp=0;
	for(int i=0;i<7;++i)
	{
    
    
		if(a[i]&&b[i]==i)temp++;
	}
	if(temp==1)ans++;
}

void dfs(int t)
{
    
    
	if(t==7)return;
	for(int i=0;i<=1;++i)
	{
    
    
		a[t]=i;
		if(t==6)pun();
		dfs(t+1);
	}
	
} 

int main()
{
    
    
	v[0][1]=1;v[0][5]=1;
	v[1][2]=1;v[1][6]=1;
	v[2][3]=1;v[2][6]=1;
	v[3][4]=1;
	v[4][5]=1;v[4][6]=1;
	v[5][6]=1;
	dfs(0);//dfs用来求排列问题 
	cout<<ans;
    return 0;
}

二刷

#include <iostream>

using namespace std;

int a[7];
int v[7][7];
int b[7];
int ans;

int find(int x)
{
    
    
	if(b[x]!=x)b[x]=find(b[x]);
	return b[x];
}

void unionn(int x,int y)
{
    
    
	b[find(x)]=find(y);
}

void pun()
{
    
    
	for(int i=0;i<7;++i)b[i]=i;
	for(int i=0;i<7;++i)
	{
    
    
		if(a[i]==0)continue;
		for(int j=0;j<7;++j)
		{
    
    
			if(a[j]==0)continue;
			if(v[i][j]||v[j][i])
			{
    
    
				unionn(i,j);
			}
		}
	}
	int temp=0;
	for(int i=0;i<7;++i)
	{
    
    
		if(a[i]&&b[i]==i)temp++;
	}
	if(temp==1)ans++;
	
}

void dfs(int t)
{
    
    
	if(t==7)return;
	for(int i=0;i<=1;++i)
	{
    
    
		a[t]=i;
		if(t==6)pun();
		dfs(t+1);
	}
}

int main() 
{
    
    
	v[0][1]=1;v[0][5]=1;
	v[1][2]=1;v[1][6]=1;
	v[2][3]=1;v[2][6]=1;
	v[3][4]=1;
	v[4][5]=1;v[4][6]=1;
	v[5][6]=1;
	dfs(0);
	cout<<ans;
    return 0;
}

第五题:平面分割

答案:1391

#include <iostream>

using namespace std;
int sum_circle(int n)
{
    
    
	int ans=2;
	for(int i=2;i<=n;++i)
	{
    
    
		ans+=(i-1)*2;
	}
	return ans;
}

int sum_line(int n)
{
    
    
	int ans=2;
	for(int i=2;i<=n;++i)
	{
    
    
		ans+=i;
	}
	return ans;
}

int sum_circle_line(int n)
{
    
    
	int ans=2;//一个圆把平面分为2部分 
	
	for(int i=2;i<=n;++i) 
	{
    
    
		ans+=(i-1)*2;
	}

	
	ans+=n*2;
	
	for(int i=2;i<=n;++i)
	{
    
    
		ans+=n*2+i;
	}
	return ans;
}


int sum_circle_line2(int m,int n)
{
    
    
	int ans=2;
	for(int i=2;i<=m;++i)
	{
    
    
		ans+=(i-1)*2;
	}
	
	ans+=2*m;
	
	for(int i=2;i<=n;++i)
	{
    
    
		ans+=m*2+i;
	}
	return ans;
}

int main() 
{
    
    
	cout<<sum_circle(20)<<" "<<sum_line(20)<<" "<<sum_circle_line(20)<<" "<<sum_circle_line2(20,20);
    return 0;
}

第七题:回文日期

#include<iostream>
#include <sstream>
#include<stdlib.h>
#include<stdio.h>

using namespace std; 
string s,a,b;
int main(){
    
    
	string s,s1;cin>>s;
	s1=s;
	for(char i='1';i<='9';++i)
	{
    
    
		for(char j='0';j<='3';++j)
		{
    
    
			if(j=='3'&&i>'1')continue;
			for(char k='0';k<='9';++k)
			{
    
    
				for(char h='0';h<='1';++h)
				{
    
    
					if(h=='0'&&k=='0')continue;
					if(h=='1'&&k>'2')continue;
					if(j=='0'&&i=='0')continue;
					if(j=='3'&&i>'1')continue;
					s[0]=i;s[7]=i;
					s[1]=j;s[7-1]=j;
					s[2]=k;s[7-2]=k;
					s[3]=h;s[7-3]=h;
					if(s>s1)break;
				}
				if(s>s1)break;
			}
			if(s>s1)break;
		}
		if(s>s1)break;
	}
	cout<<s<<endl;
	s=s1;
	for(char i='1';i<='9';i++)
	{
    
    
		for(char j='0';j<='1';++j)
		{
    
    
			if(j=='1'&&i>'2')continue;
			if(j=='0'&&i=='0')continue;
			for(int k=0;k<4;++k){
    
    
				if(k%2==0){
    
    
					s[k]=i;
				}
				else s[k]=j;
			}
			for(int k=4;k<8;++k){
    
    
				if(k%2==0){
    
    
					s[k]=j;
				}
				else s[k]=i;
			}
			if(s>s1)break;
		}
		if(s>s1)break;
	}
	cout<<s;
	return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_42641977/article/details/120796785