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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wow_awsl_qwq

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

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

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

打赏作者

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

抵扣说明:

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

余额充值