2019 年第十届蓝桥杯省赛 B组 C++超详细题解

时间:2022-07-28
本文章向大家介绍2019 年第十届蓝桥杯省赛 B组 C++超详细题解,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

A1.组队(枚举) 思路:我们直接观察图即可!

#include<bits/stdc++.h>
 
using namespace std;
 
int main(){
    cout<<"490"<<endl;
    return 0;
}

B 2.年号字串 思路:明显是个26进制好吧 那么 2019 = 2*26^2 + 25 * 26 + 17

#include<bits/stdc++.h>
 
using namespace std;
 
int main(){
    cout<<"BYQ"<<endl;
    return 0;
}

C3.数列求值(大数) 思路:考察递推呗,那你就推呗,每次只要后四位,所以对10000取余就行了。

#include<bits/stdc++.h>
#define maxn 100000004
using namespace std;
typedef long long ll; 
int a[maxn];

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

D4.数的分解(枚举) 思路:暴力去试试呗,没啥可讲的

#include<bits/stdc++.h>
 
using namespace std;
 
int main(){
    cout<<"40785"<<endl;
    return 0;
}

E 5.迷宫(bfs) 思路:很直接的一个BFS题目。 就是方向数组你记得按照人家说的来。

#include<bits/stdc++.h>
#define maxn 50
using namespace std;

char a[maxn][maxn];

bool vis[maxn][maxn]={0};
int f[4][2] = {{1,0},{0,-1},{0,1},{-1,0}};

char ch[4]={'D','L','R','U'};

int n,m;

struct add{
	int x;
	int y;
	add(int a,int b){
		x=a;
		y=b;
	}
	string s;//记录路径 
};


void bfs(){
	queue<add> q;
	add p = {0,0};
	p.s = "";
	q.push(p);
	
	vis[0][0] = 1;
	while(!q.empty()){
	add t = q.front();
	q.pop();
	
	if(t.x==n-1 && t.y == m-1){
		cout<<t.s<<endl;
		break;
	}
	
	for(int i=0;i<4;i++){
		int dx = t.x +f[i][0];
		int dy = t.y +f[i][1];
		
		if(dx>=0 && dx<n&&dy>=0&&dy<m){
			if(a[dx][dy]=='0' && !vis[dx][dy]){
				add k(dx,dy);
			    k.s = t.s + ch[i];
			    q.push(k);
			    vis[dx][dy] = 1;
			}
		} 
	}
	
	}
} 



int main(){
	cin>>n>>m;
	
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>a[i][j];
		}
	}
	bfs();
	
	return 0;
}

F 6.特别数的和(枚举) 思路:没啥可说的,大水题

#include<bits/stdc++.h>
 
using namespace std;
 
bool check(int k){
    int res;
    while(k!=0){
        res = k % 10;
        if(res==2 || res==0 || res==1 || res==9) return false;
        k/=10;
    }
    return true;
}
 
 
int main(){
    int n;
    cin>>n;
    int sum = 0;
    for(int i=1;i<=n;i++){
        if(!check(i)){
        sum += i;
        //cout<<i<<endl;    
        } 
    }
    cout<<sum<<endl;
    return 0;
}

G 7.完全二叉树的权值 思路:完全二叉树的层数为 log2(n) + 1; 每层有 pow(2,i)个节点;记得最后一层不一定满的

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define maxn 100003
using namespace std;
int a[maxn];
 
int qp(int a,int b){
    int res = 1;
    while(b){
        if(b&1) res *= a;
        a *= a;
        b  = b>> 1;
    }
    return res;
}
 
 
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
     
    int ce = log2(n)+1;
     
    int k = 0;
    int sum;
    int ans = -inf;
    int res;
     
    for(int i=1;i<ce;i++){
        sum = 0; 
        for(int j=1;j<=qp(2,i-1);j++){
            sum += a[k++];
        }
        if(sum > ans){
            ans = sum;
            res = i;
        }
    }
     
    sum = 0;
    for(int i=k;i<n;i++){
        sum += a[i]; 
    }
    if(sum > ans){
            res = ce;
    }
    cout<<res<<endl;
     
    return 0;
} 

H 8.等差数列 思路:没啥可说的就是一个公式 因为 an = a1 + (n-1)/d 然后怎么求N少啥你求啥就行了

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define maxn 1000005
using namespace std;
typedef long long ll;
ll a[maxn],b[maxn];
int main(){
	ll n;
	cin>>n;
	for(ll i=0;i<n;i++){
		cin>>a[i];
	} 
    sort(a,a+n);
    ll res;
    bool flag = 0;
    ll k;
    res = a[1] - a[0];
    if(res == 0) flag = 1;
    for(ll i=2;i<n;i++){
    	 b[i] = (a[i]-a[i-1]);
    	 res = __gcd(b[i],res);
    	 if(b[i] == 0){
    		flag = 1;
    		break;
		}
	}
	if(flag){ 
       cout<<n<<endl;
       return 0;
    }
     ll ans = (a[n-1]-a[0])/res + 1;
   
  	cout<<ans<<endl;
	return 0;
}

9.后缀表达式 思路:讨论吧,没啥好方法

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int maxn = 2e5+100;
ll a[maxn];

int main() {
  int n,m;
  cin >> n >>m; 
  int num = n+M+1;
  int fu = 0;
  ll sum = 0;
  
  for (int i = 0; i < num; i++) {
    cin >> a[i];
    sum += a[i];
    if(a[i] < 0) fu++;
  }
  sort(a, a+num);
  
  if (m){ //如果有减法,需要对比总数目与负数数目
    if (fu) { //如果有负数
      if (fu == num) { //负数的数目与总目相等(必有一个负数无法通过加括号的形式变为正,故不能加回)
        for(int i = 0; i < fu - 1; i++){
          sum -= 2ll*a[i]; //输入时sum减过一次这些负数,现在是加回负元素,故应减去两倍(负负得正)。
        }
      } else { //负数的数目与总数目不相等(所有负数都可以变正,故将所有负数加回)
        for (int i = 0; i < fu; i++) {
          sum -= 2ll*a[i];
        }
      }
    } else { //如果没有负数,就只有一个负号起作用,减去正数min
      sum -= 2ll * a[0];
    }
  }
  //如果没有减法,则最大值就直接是所有数的和
  cout << sum << endl;
  return 0;
}

最后一题很灵异,没有AC,太弱了,orz