《2019年蓝桥杯C++b组》

  • Post author:
  • Post category:其他




A-组队

作为篮球队教练,你需要从以下名单中选出1 号位至5 号位各一名球员,组成球队的首发阵容。

每位球员担任1号位至5号位时的评分如下表所示。请你计算首发阵容1号位至5号位的评分之和最大可能是多少?

//手算 答案490



B-年号字符

题目描述

小明用字母A 对应数字1,B 对应2,以此类推,用Z 对应26。对于27以上的数字

小明用两位或更长位的字符串来对应,例如AA 对应27,AB 对应28,AZ 对应52,LQ 对应329。

请问2019 对应的字符串是什么?

//答案BYQ 这个题我还是手算的。太菜了不会写代码



C-数列求值

题目描述

给定数列1, 1, 1, 3, 5, 9, 17, …,从第4 项开始,每项都是前3 项的和。求

第20190324 项的最后4 位数字。

//这个题目也是非常简单的。需要注意的是每求和一次对10000求余

#include<iostream>
#include<algorithm>
using namespace std;
int a[20190324];
int main() {
    a[0]=1;
    a[1]=1;
    a[2]=1;
    for(int i=3; i<20190324; i++) {
        a[i]=(a[i-1]+a[i-2]+a[i-3])%10000;
    }
    cout<<a[20190323]%10000<<endl;
    return 0;
}



D-数的分解

题目描述

把2019分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?

注意交换3个整数的顺序被视为同一种方法,例如1000+1001+18 和1001+1000+18 被视为同一种。


//暴力,注意是3个不相同的正整数,防止重复,i<j<k

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x7fffffff
 int a,b,c,sum;
 bool tian(int x){
 	while(x){
 		if(x%10==4||x%10==2)
 		return false;
 		x=x/10;
	 }
	 return true;
 }
int main()
{ 
sum=0;
 for( a=1;a<2019;a++){
 	for( b=a+1;b<2019;b++){
 		for(c=b+1;c<2019;c++){
 			if(a+b+c==2019){
 				if(tian(a)&&tian(b)&&tian(c))
 				sum++;
			 }
		 }
	 }
 }
 cout<<sum<<endl;
    return 0;
}



E-特别数的和

题目描述

小明对数位中含有2、0、1、9 的数字很感兴趣(不包括前导0)

在1到40中这样的数包括1、2、9、10 至32、39 和40,共28 个,他们的和是574。

请问,在1到n 中,所有这样的数的和是多少?

输入格式

输入一个正整数n(1<=n<=10000)

输出格式

输出一行,包含一个整数,表示满足条件的数的和。

输入样例 复制

40

输出样例 复制

574

//个人觉得,这个题跟D题没有很大区别。

#include <iostream>
#include <algorithm> 
using namespace std;
bool tian(int x)
{
	while(x)
	{
		int t = x % 10;
		if(t == 0 || t == 1 || t == 2 || t == 9) return true;
		x /= 10; 
	} 
	return false;
}
int main()
{
	int n;
	cin >> n;
	long long sum = 0;
	for(int i = 1; i <= n; i ++ )
	{
		if(tian(i)) 
		sum += i;
	}
	cout << sum << endl;
	return 0;
}




F-完全二叉树的权值

题目描述

给定一棵包含N 个节点的完全二叉树,树上每个节点都有一个权值,按从

上到下、从左到右的顺序依次是A1, A2, AN,如下图所示:

在这里插入图片描述

现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点

权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。

注:根的深度是1。

输入格式

第一行包含一个整数N。

第二行包含N 个整数A1, A2, AN

对于所有评测用例,1<=N<=100000, -100000<=Ai<=100000。

输出格式

输出一个整数代表答案。

输入样例 复制

7

1 6 5 4 3 2 1

输出样例 复制

2

//这个自己的代码只过了80%的数据,但是我已经很开心了


正确的题解请去看其他博主的博客

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x7fffffff
const int Max_=1e5+5;
long long a[Max_];
long long b[Max_];
int main()
{
long long n;
cin>>n;
long long t=1,x=1,k=1;
for(long long i=0;i<n;i++){
	cin>>a[i];
	b[k]+=a[i];
	x--;
	if(x==0){
		k++;
		t=t*2;
		x=t;
	}
}
long long max=-999999,y;
for(long long i=0;i<k;i++){
	if(b[i]>max){
		max=b[i];
		y=i;
	}
}
cout<<y<<endl;
    return 0;
}



G-等差数列

题目描述

数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N 个整数。

现在给出这N 个整数,小明想知道包含这N 个整数的最短的等差数列有几项?

输入格式

输入的第一行包含一个整数N。

第二行包含N 个整数A1.A2,…, AN。(注意A1<=AN 并不一定是按等差数列中的顺序给出)

2<=N<=100000,0<=Ai<=10^9

输出格式

输出一个整数表示答案。

输入样例 复制

5

2 6 4 10 20

输出样例 复制

10

数据范围与提示

包含2、6、4、10、20 的最短的等差数列是2、4、6、8、10、12、14、16、18、20。


//根据等差数列公式an=a1+(n-1)×d,注意公差为0,输出n

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x7fffffff
const int Max_=1e6+5;
long long a[Max_];
int main() {
    int n;
    cin>>n;
    long long min=inf,max=0;
    for(long long i=0; i<n; i++) {
        cin>>a[i];
        if(a[i]<min)
            min=a[i];
        if(a[i]>max)
            max=a[i];
    }
    sort(a,a+n);
    long long d=inf;
    for(int i=1; i<n; i++) {
        if(a[i]-a[i-1]<d)
            d=a[i]-a[i-1];
    }
    if(d==0)
    cout<<n<<endl;
    else
    cout<<(max-min)/d+1<<endl;
    return 0;
}



H-后缀表达式

题目描述

给定N 个加号、M 个减号以及N + M + 1 个整数A1,A2,…,AN+M+1

小明想知道在所有由这N 个加号、M 个减号以及N + M +1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个?

请你输出这个最大的结果。

例如使用1 2 3 + -,则“2 3 + 1 -” 这个后缀表达式结果是4,是最大的。

输入格式

第一行包含两个整数N 和M。

第二行包含N + M + 1 个整数A1,A2,…,AN+M+1

0<=N,M<=100000,-10

9<=Ai<=10

9

输出格式

输出一个整数,代表答案。

输入样例 复制

1 1

1 2 3

输出样例 复制

4

//自己的代码过了30%,忽略了可以加括号的问题

//下面是某大佬的代码即解题思路

//给题意翻译翻译,其实就是有n个加号,m个减号,n+m+1个数,可以加括号,问组成表达式的最大值。

特殊情况:m=0,直接输出和

一般情况:把所有数排个序,最大的拿出来,放首项,把最小的数拿出来,给他一个减号,再套一个括号,那么现在还未完成的表达式长这样:

可以发现,现在如果我想加一个数的话,给它一个加号,放在括号外面,也可以给它一个减号,放在括号里面;减一个数同理。换句话说,只要用一个减号,一个最大值,一个最小值,其他数我想加就加,想减就减。那么为了使结果最大,我加上正数,减去负数,就是直接加上所有剩下数的绝对值,那么就解决了。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;
const int N = 200010;
typedef long long LL;

int n, m;
int a[N];

int main()
{
    scanf("%d%d", &n, &m);
    int k = n + m + 1; 
    for(int i = 0; i < k; i ++ ) scanf("%d", &a[i]);
    
    sort(a, a + k);
    
    LL res = 0;
    if(m <= 0) 
        for(int i = 0; i < k; i ++ ) res += a[i];
    else
    {
        res = a[k - 1] - a[0];
        for(int i = 1; i < k - 1; i ++ ) res += abs(a[i]);
    }
    
    
    cout << res << endl;
    return 0;
}



总结

2022年3月12号,2019年的蓝桥杯是我这几天写出来最多的一个。本来下午看完网站程序设计就挺迷茫的,感觉几个小时过去了,没有一点点的收获。然后这个2019年的蓝桥杯哈哈哈哈哈,突然让我自信起来了。完全二叉树那个题目自己都没有想到可以过了那么多的数据。也让我想起来老师说的一句话:要相信自己是最棒的。最最最重要的还是,我好想好想参加国赛。

今天下雨了!



版权声明:本文为Sharing_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。