2019年第十届蓝桥杯C/C++ B组省赛题

试题A——组队

在这里插入图片描述
在这里插入图片描述
思路:这个题其实很简单,只需要口算就行了,不需要写程序,需要注意的是一个球员如果两个最高分的话,只能取一个。
很多种取法,比如:97+99+99+97+98
答案:490

试题B——年号字串

在这里插入图片描述
思路:这相当于一道26进制的题目,但又不完全是;
答案:BYQ

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
  int n=2019;
  string t="";
  while(n){
  	int k=n%26;
  	t+=('A'+k-1);
  	n/=26;
  }
  reverse(t.begin(),t.begin()+t.size());
  cout<<t<<endl;
  return 0;
}

reverse对容器中的元素进行反转,string用法如下:
string s;
reverse(s.begin(),s.begin()+3);//对于字符串s[0]到s[2]进行反转

试题C——数列求值

给定数列1,1,1,3,5,9,17,…,从第4项开始,每项都是前3项的和。求
第20190324项的最后4位数字。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个4位整数(提示:答案的千位不为0),在提交答案时只填写这个整数,填写
多余的内容将无法得分。

思路:类似于斐波拉奇数列,就是这个只需要关注后四位数字,那么对于每个数%10000就可以了

答案: 4659

代码:

#include<bits/stdc++.h>
using namespace std;
int a[30000000];
int main()
{
  a[1]=a[2]=a[3]=1;
  for(int i=4;i<=20190324;i++){
  	a[i]=(a[i-3]+a[i-2]+a[i-1])%10000;
  }
  cout<<a[20190324];
  return 0;
}

试题D——数的分解
在这里插入图片描述
思路:写一个判定一个数是否包含数字2和4的函数,主函数里可以二重循环,直接枚举就可以了

答案:40785

代码:

#include<bits/stdc++.h>
using namespace std;
int iss(int x){
	while(x){
		int k=x%10;
		if(k==2||k==4) return 0;
		x/=10;
	}
	return 1;
}
int main()
{
  int n=2019,x=0;
  for(int i=1;i<2013;i++){
  	for(int j=i+1;j<2018&&iss(i);j++){
  	        int k=n-i-j;
  	        if(j>=k) continue;
  			if(iss(i)&&iss(j)&&iss(k)) x++;
	  }
  }
  cout<<x<<endl;
  return 0;
}

试题E——迷宫
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:求最短路径,这一题用广度优先搜索去写就可以了。
答案:DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR
代码:

#include<bits/stdc++.h>
using namespace std;
char r[]="DLRU";
char a[100][100];
bool f[100][100];
int x[]={1,0,0,-1};
int y[]={0,-1,1,0};
int n=30,m=50;
struct s{
	int xx,yy,step;
	string str;
	s(int x,int y,int ss,string sp){
		xx=x,yy=y,step=ss,str=sp;
	}
};
void bfs(int c,int d){
	queue<s>p;
	p.push(s(c,d,0,""));
	f[c][d]=true;
	while(!p.empty()){
		s t=p.front();
		if(t.xx==n-1&&t.yy==m-1){//到达了终点
		   cout<<t.str<<endl;
		   return ; 
		}
		p.pop();
		for(int i=0;i<4;i++){
			int dx=t.xx+x[i],dy=t.yy+y[i];
			if(dx>=0&&dx<n&&dy>=0&&dy<m&&!f[dx][dy]&&a[dx][dy]=='0'){
				p.push(s(dx,dy,t.step+1,t.str+r[i]));
				f[dx][dy]=1;
			}
		}
	}
}
int main()
{
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>a[i][j];
		}
	}
	bfs(0,0);
    return 0;
}

试题F——特别数的和
在这里插入图片描述
在这里插入图片描述
水题
代码:

#include<bits/stdc++.h>
using namespace std;
int n;
long long ans=0;
int main()
{
   cin>>n;
   for(int i=1;i<=n;i++){
   	int t=i,flag=0;
   	while(t){
   		int k=t%10;
   		if(k==0||k==1||k==2||k==9){
   			flag=1;
			break;
		   }
   		t/=10;
	   }
	   if(flag) ans+=i;
   }
   cout<<ans<<endl;
   return 0;
}

试题G——完全二叉树的权值
在这里插入图片描述
在这里插入图片描述
思路:并不需要建树,计算每一层的权值,然后进行比较就可以了,需要注意,题目没说是满二叉树,所以需要注意,并且权值最大有可能是负数,所以默认最大值不能初始化为0,那会导致错误

代码:

#include<bits/stdc++.h>
using namespace std;
int a[101000];
int p(int x){
	int t=1;
	while(x--)  t*=2;
	 return t;
}
int main()
{
	int n,t=1,i=2,j=2;
	scanf("%d %d",&n,&a[1]);
	long long maxx=a[1];
	for(int i=2;i<=n;i++) scanf("%d",&a[i]);
	while(i<=n){
		long long k=0;
	  for(;i<p(j)&&i<=n;i++)  k+=a[i];
	if(k>maxx)   maxx=k,t=j;
	j++;
	//cout<<k<<endl;
}
   cout<<t<<endl;
   return 0;
}

试题H——等差数列
在这里插入图片描述
思路:需要用到gcd求最大公约数。要想知道最多有多少项,知道公差d就可以了,最后的答案为 (a[n-1]-a[0])/d+1,但是只通过90%,后来在网上搜了别人的博客才想起来有一个坑点,如果给的数全都相同,那么应该输出的是长度n
代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[100100];
int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)  scanf("%d",&a[i]);
    sort(a,a+n);
    int x=a[1]-a[0];
    for(int i=2;i<n;i++){
    	x=gcd(x,a[i]-a[i-1]);
	}
	if(x==0) cout<<n<<endl;
	else 
    cout<<(a[n-1]-a[0])/x+1<<endl;
    return 0;
}

试题I——后缀表达式
在这里插入图片描述
只通过了部分例子,不知道应该怎么思考了,会的大神可以告诉我下思路,感谢~~

代码:

#include<bits/stdc++.h>
using namespace std;
long long  x=0;
int a[210000];
int main()
{
	int n,m,t=0;
	cin>>n>>m;
	for(int i=0;i<n+m+1;i++){
		cin>>a[i];
		x+=a[i];
	}
	sort(a,a+n+m+1);
	if(a[0]>=0) x=x;
	else {
		while(a[t]<0&&m--){
			x-=2*a[t],t++;
		}
	}
   cout<<x<<endl;
    return 0;
}

试题J——灵能传输
在这里插入图片描述
输入:
在这里插入图片描述
输出:
在这里插入图片描述
样例输入:

3
3
5 -2 3
4
0 0 0 0
3
1 2 3

样例输出:

3
0
3

提示
对于第一组询问:
对2 号高阶圣堂武士进行传输操作后a1 = 3,a2 = 2,a3 = 1。答案为3。
对于第二组询问:
这一组高阶圣堂武士拥有的灵能都正好可以让他们达到最佳战斗状态。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值