第十一届蓝桥杯b组省赛第二场(填空部分)

A

直接拆,计数。

#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
	int ans=0;
	for(int i=2;i<=2020;i++){
    
    
		int n=i;
		while(n){
    
    
			if(n%10==2) ans++;
			n/=10;
		}
	}
	cout<<ans;
	return 0;
} 

B

gcd(i,j)==1表示i和j互质,也就是题目所说的既约分数,把i当成分子,j当成分母,暴力计数即可。

#include<bits/stdc++.h>
using namespace std;
int gcd(int x,int y){
    
    
	int a=max(x,y);
	int b=min(x,y);
	int temp;
	while(a%b){
    
    
		temp=a;
		a=b;
		b=temp%b;
	}
	return b;
}
bool judge(int x,int y){
    
    
	if(gcd(x,y)==1) return 1;
	return 0;
} 
int main(){
    
    
	int ans=0;
	for(int i=1;i<=2020;i++){
    
    
		for(int j=1;j<=2020;j++){
    
    
			if(judge(i,j)) ans++;
		}
	}
	cout<<ans;
	return 0;
} 

C

蛇形填数,模拟题。

#include<bits/stdc++.h>
using namespace std;
int a[100][100];
int dir[4][2]={
    
    	
	{
    
    -1,1},{
    
    0,1},{
    
    1,-1},{
    
    1,0}
};
bool judge(int x,int y){
    
    
	if(x>=1&&y>=1) return 1;
	return 0;
}
int main(){
    
    
	int cnt=1;
	int p=1;
	int i=1,j=1;
	a[i][j]=cnt++;
	while(p<=40){
    
    
		//a[i][j]=cnt++;
		//cout<<i<<" "<<j<<endl;
		j+=1;
		a[i][j]=cnt++;
		//cout<<i<<" "<<j<<endl;
		while(j!=1&&judge(i,j)){
    
    
			j-=1;
			i+=1;
			a[i][j]=cnt++;
			//cout<<i<<" "<<j<<endl;
		}
		i+=1;
		a[i][j]=cnt++;
		//cout<<i<<" "<<j<<endl;
		while(i!=1&&judge(i,j)){
    
    
			j+=1;
			i-=1;
			a[i][j]=cnt++;
			//cout<<i<<" "<<j<<endl;
		}
		p++;
	}
	for(int i=1;i<=20;i++){
    
    
		for(int j=1;j<=20;j++){
    
    
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}
	cout<<a[20][20];
	return 0;
}

D

我做麻烦了,反正是离线,就多造了些判断,处理二月份天数的时候比较墨迹。也是一道模拟题。
用一个变量记录天数,一个变量记录周几,然后判段更新。

#include<bits/stdc++.h>
using namespace std;
int m[13]={
    
    0,31,28,31,30,31,30,31,31,30,31,30,31};
int ml[13]={
    
    0,31,29,31,30,31,30,31,31,30,31,30,31};
int main(){
    
    
	long long ans=0;
	int d=1;
	int mm=1;
	int ye=2000;
	int f=6;
	int temp=0;
	while(!(ye==2020&&mm==10&&d==2)){
    
    
		ans++;
		if(d==1||f==1) ans++;
		d++;
		f++;
		if(f>7) f=1;
		if(temp){
    
    
			if(d>ml[mm]){
    
    
				d=1;
				mm++;
			}
		}else{
    
    
			if(d>m[mm]){
    
    
				d=1;
				mm++;
			}
		}
		if(mm>12){
    
    
			mm=1;
			ye++;
		}
		if(ye==2000||ye==2004||ye==2008||ye==2012||ye==2016||ye==2020){
    
    
			temp=1;
		}else{
    
    
			temp=0;
		}
		//cout<<ye<<" "<<mm<<" "<<d<<endl;
	}
	cout<<ans;
	return 0;
}

E

有点难受。(看了大佬的代码)
为什么要dfs,因为题目说发光的二极管是要连续的。
怎么构建连续,观察那个8,我们发现a与f,b相连,f与g,e相连,等等。
然后用数组存,会发现一个问题,即b可以到c,g也可以到c,如果直接搜怎么存合适,我们用一个#补充这个位置,代表这是一个没有字母但是可以通过的路,在搜素时可以判断一下#,然后拼接。
其它的没啥了,枚举每一个位置,然后搜素,先排序,然后用set去重一下。
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
char str[8][8]={
    
    
	{
    
    'a','b','#'},{
    
    'f','g','c'},{
    
    '#','e','d'}
};
int dir[4][2]={
    
    
	{
    
    -1,0},{
    
    0,-1},{
    
    1,0},{
    
    0,1}
};
int vis[8][8];
set<string> se;
string qsort(string s){
    
    
	char p[10];
	memset(p,'#',sizeof(p));
	int n=0;
	int len=s.size();
	for(int i=0;i<len;i++){
    
    
		if(s[i]!='#'){
    
    
			p[n++]=s[i];
		}
	}
	sort(p,p+n);
	string qq;
	for(int i=0;i<n;i++){
    
    
		qq+=p[i];
	}
	return qq;
}
bool judge(int x,int y){
    
    
	if(x>=0&&y>=0&&x<3&&y<3&&!vis[x][y]) return 1;
	return 0;
}
void dfs(int x,int y,string t){
    
    
	vis[x][y]=1;
	for(int i=0;i<4;i++){
    
    
		int xx=x+dir[i][0];
		int yy=y+dir[i][1];
		if(judge(xx,yy)){
    
    
			string tem=qsort(t+str[xx][yy]);
			se.insert(tem);
			vis[xx][yy]=1;
			dfs(xx,yy,tem);
			vis[xx][yy]=0;
		}
	}
	return ;
}
int main(){
    
    
	for(int i=0;i<3;i++){
    
    
		for(int j=0;j<3;j++){
    
    
			if(str[i][j]!='#'){
    
    
				string s;
				s+=str[i][j];
				string q=qsort(s);
				se.insert(q);
				memset(vis,0,sizeof(vis));
				dfs(i,j,q);
			}
		}
	}
	cout<<se.size();
	return 0;
}

答案:
(1)624
(2)2481215
(3)761
(4)8879
(5)80


程序题后面再补。

猜你喜欢

转载自blog.csdn.net/iuk11/article/details/114109594