2019年第十届蓝桥杯省赛(C++)B组

前言

2019年B组省赛感觉就是暴力杯,做八题完全没问题,直接跑答案就可以了,作为一个大一的萌新,感觉还可以,写了9题,拿了个省一美滋滋。
题目百度云链接链接:https://pan.baidu.com/s/1TdiiOMiny6K0zHgg9TNbQA
提取码:wrzh

A: 组队

直接搜索就完了(比赛的时候我是手算的,笑死)

#include<iostream>
using namespace std;
int a[30][6],flag[20]={0};
int maxx=0;
void dfs(int ind,int sum){
	if(ind==6){
		maxx=max(maxx,sum);
		return;
	}
	for(int j=0;j<20;j++){
		if(!flag[j]){
			flag[j]=1;
			dfs(ind+1,sum+a[j][ind]);
			flag[j]=0;
		}
	}
}
int main(){
	int n=6,m=20;
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	dfs(1,0);
	printf("%d",maxx);
	return 0;
} 
B: 年号字串

这题感觉有点问题,不是纯粹的26进制,处理出来的数字与字母是+1的映射关系

#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
int main(){
	string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ",s;
	int n=2019,ans=0;
	while(n){
		ans=n%26;
		s+=str[ans-1];
		n/=26;
	}
	reverse(s.begin(),s.end());
	cout << s;
	return 0;
}
C: 数列求值

数字有点大,来个滚动数组处理一下,模10000就可以得到后四位数了

#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
int main(){
	int s=0,n=20190324;
	int f[3]={1,1,1};
	for(int i=3;i<n;i++){
		f[i%3]=(f[(i-1)%3]+f[(i-2)%3]+f[(i-3)%3])%10000;
	}
	cout << f[(n-1)%3];
	return 0;
}
D: 数的分解

这题直接找就行了,应该还有更好更快的方法,我这里就不考虑了

#include<iostream>
using namespace std;
int flag(int x){
	if(x<=0) return 0;
	while(x){
		int ans=x%10;
		if(ans==2 || ans==4) return 0;
		x/=10;
	} 
	return 1;
}
int main(){
	int n=2019,ans=0;
	for(int i=1;i<2019;i++){
		if(flag(i)){
			for(int j=i+1;j<2019;j++){
				if(flag(j)){
					int k=2019-i-j;
					if(flag(k) && k>j)
						ans++;
				}
			}
		}	
	}
	cout << ans;
	return 0;
}
E: 迷宫

这题比赛的时候做上头了,一直想用dfs做,是可以做出来,但是我的方法跑的时间太长了,等不起就随便填了个答案,对于求这种迷宫的最短路还是用bfs好,代码都不是很长。

#include<iostream>
#include<queue>
using namespace std;
int dir[4][2]={1,0,0,-1,0,1,-1,0};
string point="DLRU";
char ans[1001];
string maze[35];
int n=30,m=50;
int vis[30][50]={0};
typedef pair<int,int> p;
typedef pair<p,string> P;
queue<P> que;

int main(){
	for(int i=0;i<n;i++){
		cin >> maze[i];
	}
	que.push(P(p(0,0),""));
	vis[0][0]=1;
	while(!que.empty()){
		P now = que.front();
		que.pop();
		p res=now.first;
		if(res.first==n-1 && res.second==m-1){
			cout << now.second;
			return 0;
		}
		for(int i=0;i<4;i++){
			int x=res.first+dir[i][0];
			int y=res.second+dir[i][1];
			if((x>=0&&x<n&&y>=0&&y<m)&&vis[x][y]==0&&maze[x][y]=='0'){
				vis[x][y]=1;
				que.push(P(p(x,y),now.second+point[i]));
			}
		}
	}
	return 0;
}
F: 特别数的和

数据似乎不大,所以循环判断即可

#include<iostream>
#include<queue>
using namespace std;
int ans(int x){
	while(x){
		if(x%10==1||x%10==2||x%10==9||x%10==0) return 1;
		x/=10;
	}
	return 0;
}
int main(){
	int n,sum=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		sum+=ans(i)?i:0;
	}
	printf("%d",sum);	
	return 0;
}
G: 完全二叉树的权值

模拟一下完全二叉树的结构,把每一层的权值加起来,找到权值总和最大的一层就行了,要注意最后一层节点数不完全为2的幂,要处理一下

#include<iostream>
#include<cmath>
using namespace std;
int main(){
	int n,sum=0,deep=0,maxx=-1000000,minn=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		sum+=x;
		if(i==pow(2,deep) || i==n){
			if(maxx<sum){
				maxx=sum;
				minn=deep;
			}
			deep++;
			sum=0;
		}
	}
	printf("%d",minn);	
	return 0;
}
H: 等差数列

这题不能简单地找最小的差值,要找差值的最大公约数,这样就可以保证有解,另外处理一下公差为0的情况

#include<iostream>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;

signed main(){
	int n,a[100010],ind;
	cin >> n;
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	ind=a[1]-a[0];
	if(ind==0) return !(cout<<n<<endl);
	sort(a,a+n);
	for(int i=1;i<n;i++){
		ind=__gcd(ind,a[i]-a[i-1]);
	}
	cout << (a[n-1]-a[0])/ind+1 << endl;
	return 0;
}
I: 后缀表达式

这题应该好写,只要用所有的’+'号把大的数字加起来,剩下的数字再减去就行了,但是真的有这么简单吗,这题分还不少,想一下后缀和中缀的区别,后缀是有隐含括号的,像输入数据0 2 1 2 3,得出的结果应该是4,所以要考虑有括号的情况。

#include<iostream>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
#define int long long
signed main(){
	int n,m,a[200010],sum=0,cnt=0,k;
	cin >> n >> m;
	k=n+m+1;
	for(int i=0;i<k;i++){
		cin >> a[i];
	}
	if(!m){
		for(int i=0;i<k;i++){
			sum+=a[i];
		}
	}else{
		sort(a,a+k);
		sum=sum-a[0]+a[k-1];
		for(int i=1;i<k-1;i++){
			sum+=abs(a[i]);
		}
	}
	cout << sum;
	return 0;
}
J: 灵能传输

这题真不会了

在这里插入代码片
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值