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,-109<=Ai<=109 输出格式 输出一个整数,代表答案。 输入样例 复制 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年的蓝桥杯哈哈哈哈哈,突然让我自信起来了。完全二叉树那个题目自己都没有想到可以过了那么多的数据。也让我想起来老师说的一句话:要相信自己是最棒的。最最最重要的还是,我好想好想参加国赛。 今天下雨了!
|