2022年蓝桥杯省赛真题解析(C++B组)

Posted 暮色_年华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022年蓝桥杯省赛真题解析(C++B组)相关的知识,希望对你有一定的参考价值。

2022.4.9  记录我第一次参加蓝桥杯



填空

答案:1478

答案4

感觉012三个连续的应该不算

 7天做5a+2b道题,算n中有几个5a+2b,再算还需要几天

#include<iostream>
using namespace std;
int main()
	long long a,b,n;
	cin>>a>>b>>n;
	int day=0;
	day+=(n/(5*a+2*b))*7;
	int d=n%(5*a+2*b);
	int d1=0;
	d1+=a;
	if(d1>=d)
		cout<<day+1;
		return 0;
	
	d1+=a;
	if(d1>=d)
		cout<<day+2;
		return 0;
	
	d1+=a;
	if(d1>=d)
		cout<<day+3;
		return 0;
	
	d1+=a;
	if(d1>=d)
		cout<<day+4;
		return 0;
	
	d1+=a;
	if(d1>=d)
		cout<<day+5;
		return 0;
	
	d1+=b;
	if(d1>=d)
		cout<<day+6;
		return 0;
	
	d1+=b;
	if(d1>=d)
	  cout<<day+7;
	  return 0; 
	 
	 
	

通过模拟,发现当修剪两个回合后就会重复,所以只要循环两个回合。注意当循环到最后一个和第一个注意变向.

#include<iostream>
#include<cstring>
using namespace std;
int n;
int h[10001];
int m[10001];
int flag;
int main()
	cin>>n;
	memset(h,0,sizeof(h));
	memset(m,0,sizeof(m));
	int index=1;
	flag=0;
	for(int k=0;k<3*n;k++)
	 for(int i=1;i<=n;i++)
		h[i]++;
		m[i]=max(h[i],m[i]);
	 
	 h[index]=0;
	 if(index==1)
	 	flag=0;
	 
	 if(index==n)
	 	flag=1;
	 
	 if(flag==0)
	 	index++;
	 
	 else
	 	index--;
	  
    
	for(int i=1;i<=n;i++)
		cout<<m[i]<<endl;
	
	return 0;
	

 

 这题卡了我好长时间~

一开始不知道为什么321转化为65。后来通过一个个数枚举发现了规律。

321=3*10*2+2*2+1

然后这题用贪心

#include<iostream>
using namespace std;
int n;
int ma;
int a[100000];
int mb;
int b[100000];
int c[100000];
int jin[100000];
int main()
	cin>>n;
	cin>>ma;
	for(int i=ma;i>=1;i--)
		cin>>a[i];
	
	cin>>mb;
	for(int i=mb;i>=1;i--)
		cin>>b[i];
	
	jin[0]=1;
	for(int i=1;i<=max(ma,mb);i++)
		c[i]=a[i]-b[i];
		if(c[i]>=0)
		   if(a[i]<=2&&b[i]<=2)
		   	jin[i]=2;
		   
		   else
		   	jin[i]=max(a[i],b[i])+1;
		   
		
		else
			jin[i]=n;
		
	

	
	int sum=0;
	for(int i=1;i<=max(ma,mb);i++)
		int s=1;
		for(int k=0;k<i;k++)
			s*=jin[k];
		
		sum+=c[i]*s;
	
	cout<<sum;
	return 0;

	

 

不会化简,前缀和预处理之后,直接暴力写 

#include<iostream>
#include<cstring>
using namespace std;
int n,m,k;
int num[501][501];
int sum[501][501];
int sum1[501][501];
int a[501];
int dp[501];
void input()
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>num[i][j];
		
	

void init_sum() 
	memset(sum, 0, sizeof(sum));
	for (int j = 1; j <= m; j++) 
		for (int i = 1; i <= n; i++) 
			sum[i][j] = sum[i - 1][j] + num[i][j];
		
	


int cnt(int a[])
	int cnt=0;
	int sum=0;
	for(int i=1;i<=m;i++)
		for(int j=i;j<=m;j++)
			sum=0;
		      for(int k=i;k<=j;k++)
		      	sum+=a[k];
		      
		      if(sum<=k)
		      cnt++;
		
	
	return cnt;

int main()
	input();
	init_sum();
	int count=0;
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++)
			for(int l=1;l<=m;l++)
				a[l]=sum[j][l]-sum[i-1][l];
				
			
			count+=cnt(a);
		
	
	cout<<count;
	return 0;

 

/*
3 4 10
1 2 3 4
5 6 7 8
9 10 11 12
*/ 

不会。。。。

 这题我用dfs连通分量写的。

火箭和雷统一可以看成一个半径为r的圆,圆心距小于半径时(d<=r)时,说明两个圆邻接。用grid[x][y]记录编号为x,y的圆是否邻接

#include<iostream>
#include<cmath> 
using namespace std;
int n, m;
int grid[5000][5000];
struct node 
	int x, y, r;
	node() 
	
	node(int _x, int _y, int _r) 
		x = _x;
		y = _y;
		r = _r;
	
no[50001];
void input() 
	cin >> n >> m;
	for (int i = 1; i <= n; i++) 
		cin >> no[i].x >> no[i].y >> no[i].r;
	
	for (int i = n+1; i <= n+m; i++) 
		cin >> no[i].x >> no[i].y >> no[i].r;
	

double dis(int i, int j) 
	return sqrt((no[i].x - no[j].x) * (no[i].x - no[j].x) + (no[i].y - no[j].y) * (no[i].y - no[j].y));

int cnt = 0;
void dfs(int n) 

	for (int i = 1; i <= n + m; i++) 
		if (grid[n][i] == 1 && n != i) 
			grid[n][i] =grid[i][n]=0;
			cnt++;
			dfs(i);
		
	

int main() 
	input();
	for (int i = 1; i <= n+m; i++) 
		for (int j = 1; j <= n+m; j++) 
			if (dis(i, j)<=no[i].r) 
		
				grid[i][j]=1;
			
		
	
	for (int i = n + 1; i <= n + m; i++) 
		dfs(i);
	
	cout << cnt;

这题我用dfs+ 记忆化搜索

#include<iostream>
#include<cstring>
using namespace std;
int N, M;
int dp[1000][101][101];
int dfs(int sum, int n, int m) 
    if (sum < 0)return 0;
	if (n > N)return 0;
	if (m > M - 1)return 0;
	if (dp[sum][n][m])return dp[sum][n][m]%1000000007;
	if (sum == 1 && n == N && m == M - 1)return 1;
	dp[sum][n][m] =(dfs(2 * sum, n + 1, m) + dfs(sum - 1, n, m + 1))%1000000007;
	return dp[sum][n][m];

int main() 
	memset(dp, 0, sizeof(dp));
	cin >> N >> M;
	cout << dfs(2, 0, 0);

 不会。。。。

以上是关于2022年蓝桥杯省赛真题解析(C++B组)的主要内容,如果未能解决你的问题,请参考以下文章

第十三届蓝桥杯省赛C++B组 真题题解(详细讲解+代码分析)看这篇就够了~~~

第十三届蓝桥杯省赛C++B组 真题题解(详细讲解+代码分析)看这篇就够了~~~

第十二届蓝桥杯省赛第二场C++B组真题

第十二届蓝桥杯省赛第二场C++B组 真题题解(详细讲解+代码分析)看这篇就够了~~~

2022年第十三届蓝桥杯省赛Java B组真题及题解

蓝桥杯赛前冲刺-枚举暴力和排序专题2(包含历年蓝桥杯真题和AC代码)