2019年蓝桥杯B组
1.组队
题目
作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,
组成球队的首发阵容。
每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1
号位至 5 号位的评分之和最大可能是多少?
解析
这题如果没看清题可能答案就是492了,要看清不能是同一个人
可以看到我们圈出的每一个位置的最大值1号位和3号位还有4号位都是同一个人,这显然是错的。
所以有一个限制条件就是每个人只能去一个位置而不是多个位置。
这道题目编程实现的话还不如直接算来的直接。
答案
答案:490
2.年号字串
题目
解析
这道题目实际就是一个将十进制转换为26进制,分析题目给的数据
A——1
1 * 26^0 = 1
Z——26
26 * 26^0 = 26
AA——27
1 * 26^1 + 1 * 26^0 = 26 + 1 = 7
AB——28
1 * 26^1 + 2 * 26^0 = 26 + 2 = 28
AZ——52
1 * 26^1 + 26 * 26^0 = 26 + 26 = 52
LQ——329
12 * 26^1 + 17 * 26^0 = 312 + 17 = 329
这样就可以推出来是10进制转换26进制了
然后我们模拟将十进制转换为26进制即可,使用短除法,在逆序输出字符串即可。
代码
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
char str[27] = {0,'A','B','C','D','E','F','G','H','I','J','K'
,'L','M','N','O','P','Q','R','S','T','U','V',
'W','X','Y','Z'};
int main()
{
int num,i;
string ans="";
scanf("%d",&num);
while(num)
{
ans+=str[num%26];
num/=26;
}
for(i=ans.size()-1;i>=0;i--)
{
cout<<ans[i];
}
return 0;
}
3.数列求值
题目
解析
这个题目其实不需要高精度,求余就行了因为求的是最后四位数字
代码如下
代码
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int a[211111111];
int main()
{
a[1]=1,a[2]=1,a[3]=1;
int i;
for(i=4;i<211111111;i++)
{
a[i]=(a[i-1]+a[i-2]+a[i-3])%10000;
}
cout<<a[20190324]<<endl;
return 0;
}
答案
答案:4659
4.数的分解
题目
解析
这题因为是填空题暴力就没有问题了,尝试暴力yes很好的方法毕竟不需要去展示代码,能暴力出来的就暴力就够了。
代码
#include <bits/stdc++.h>
using namespace std;
bool check(int x, int y, int z) { //判断三个正整数中是否含2或4
int res = 0;
while (x) {
res = x % 10;
if (res == 2 || res == 4) return false;
x /= 10;
}
while (y) {
res = y % 10;
if (res == 2 || res == 4) return false;
y /= 10;
}
while (z) {
res = z % 10;
if (res == 2 || res == 4) return false;
z /= 10;
}
return true;
}
int main() {
int ans = 0;
for (int a = 1; a < 2019; a++) {
for (int b = 1; b < 2019; b++) {
if (b == a) continue; //a,b,c三个数不相同
for (int c = 1; c < 2019; c++) {
if (b == c || a == c) continue;
if (a + b + c == 2019 && check(a, b, c)) ans++;
}
}
}
cout << ans / 6 << endl;
return 0;
}
答案
应为是暴力嘛,所以要等上一段时间,,,,啊哈哈!!!!!!
答案:407895
5.迷宫
这题太难了,还没做出来,有做出来的可以和我分享,啊嘿嘿。
6.特别数的和
题目
解析
这题几乎是送分的了,所以不要被第五题给困惑住了,没准后面有简单的题呢,
这题分析可以这样,对数求余再看看这个余数是不是2,1,0,9直到余数为0 退出循环。
代码如下
代码
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n,sum;
int ak(int m)
{
while(m)
{
int pre;
pre=m%10;
if(pre==2||pre==0||pre==1||pre==9)
return 1;
m/=10;
}
return 0;
}
int main()
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
if(ak(i))
{
sum+=i;
}
}
cout<<sum<<endl;
return 0;
}
7.完全二叉树的权值
题目
解析
这题吧,很水,注意他是完全二叉树,我们直接将每一层的数加起来依次比较就可以了。
记录他的权值和深度,注意大的和就更新,等于小于就不用更新了,再用一个数记录他的深度即可
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
int n;
cin >> n;
LL maxv = INT_MIN; //INT_MIN是在limits.h头文件中,代表INT型最小值 ,这里记录权值和最大
LL maxv_d = 0; //最大的权值和的层数
for (int i = 0, length = 1, depth = 1; i < n; depth++, length *= 2)
{
LL sum = 0; //每一层的和
for (int j = 0; j < length && i < n; j++, i++ )
{
int x;
cin >> x;
sum += x;
}
if (sum > maxv)
{
maxv = sum;
maxv_d = depth;
}
}
cout << maxv_d << endl;
return 0;
}
8.等差数列
题目
解析
这题主要步骤还是求最大公约数,我们需要从这数据中依依求出最大公约数,而等差数列长度是(a[n]-a[1])/d+1
代码
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxp=1e5+5;
LL a[maxp];
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int i,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
int d=a[1];
for(i=2;i<=n;i++)
{
d=gcd(d,a[i]);
}
if(d==n)
cout<<n<<endl;
else
cout<<(a[n]-a[1])/d+1<<endl;
return 0;
}
9.后缀表达式
题目
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 200010;
int n, m;
int a[maxn];
int main()
{
scanf("%d%d", &n, &m);
int k = n + m + 1;
LL sum = 0;
for (int i = 0; i < k; i++)
{
scanf("%d", &a[i]);
sum += a[i]; //求这些数的和
}
sort(a, a + k);
if (a[0] >= 0) //第一个数大于0,说明没有负数,因为之前加过一次a[0],然后我们本来就需要减掉a[0],所以减掉2*a[0]
{
if (m) sum -= 2 * a[0];
}
else //如果是负数的那么我们需要加上,因为之前是负数,加上去也就相当于减掉,所以-=2*a[i](a[i]<0)
{
for (int i = 0; i < k && a[i] < 0 && m > 0; i++ )
{
sum -= a[i] * 2;
m-- ;
}
}
cout << sum << endl;
return 0;
}
10.灵能传输
目前还不会,正在努力中