A、数列求值
题目描述
给定数列1, 1, 1, 3, 5, 9, 17, …,从第4 项开始,每项都是前3 项的和。求
第20190324 项的最后4 位数字。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long int f1=1;
long long int f2=1;
long long int f3=1;
long long int f=0;
for(int i=4;i<=20190324;i++)
{
f=(f1+f2+f3)%10000;
f1=f2;
f2=f3;
f3=f;
}
cout<<f;
return 0;
}
B、完全二叉树的值
题目描述
给定一棵包含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
代码:
#include <bits/stdc++.h>
using namespace std;
int a[100010];
#define INF 0x3f3f3f3f
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
long long int maxsum=-INF,sum=0;
int k=0,pos=1;
for(int i=1;;i++)
{
if(pow(2,i)>=n+1)
{
k=i;
break;
}
}
int ans=1,f=0;
for(int i=1;i<=k;i++)
{
sum=0;
for(int j=1;j<=pow(2,i-1);j++)
{
sum+=a[ans++];
if(ans>n)
{
f=1;
break;
}
}
if(sum>maxsum)
{
maxsum=sum;
pos=i;
}
}
cout<<pos;
return 0;
}
C、组队
题目描述
作为篮球队教练,你需要从以下名单中选出1 号位至5 号位各一名球员,组成球队的首发阵容。
每位球员担任1号位至5号位时的评分如下表所示。请你计算首发阵容1号位至5号位的评分之和最大可能是多少?
![](https://img-blog.csdnimg.cn/img_convert/35017a7e50662f9fc60abc465e59f174.png)
该表格可以参考team.txt
解题思路:
这道题直接看图就可以做
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
cout<<97+99+99+97+98;
return 0;
}
D、年号字串
题目描述
小明用字母A 对应数字1,B 对应2,以此类推,用Z 对应26。对于27以上的数字
小明用两位或更长位的字符串来对应,例如AA 对应27,AB 对应28,AZ 对应52,LQ 对应329。
请问2019 对应的字符串是什么?
解题思路:
这题我是用笔算的。2019%26=17,这个余数一定是最后一个字符,2019=(2*26+25)*26+17(就是一直对26取余),=2*26^2+25*26+17,所以2对应B,对应Y,17对应Q。结果就是BYQ
答案:BYQ
E、数的分解
题目描述
把2019分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?
注意交换3个整数的顺序被视为同一种方法,例如1000+1001+18 和1001+1000+18 被视为同一种。
解题思路:
这道题目之前我单独发过一次博客,是我上次参加蓝桥杯之前写的,现在我又写一遍,上次的进行了优化,这次的没有,由于是填空题,所以也就没必要费精力。
代码:
#include<bits/stdc++.h>
using namespace std;
bool panduan(int n)
{
while(n)
{
if(n%10==2||n%10==4)
return false;
n/=10;
}
return true;
}
int main()
{
int ans=0;
for(int i=1;i<2019;i++)
{
if(!panduan(i))
continue;
for(int j=i+1;j<2019-a;j++)
{
int k=2019-i-j;
if(k<=0)
break;
else if(k<=j)
break;
else if(panduan(j)&&panduan(k))
{
ans++;
}
}
}
cout<<ans;
return 0;
}
F、特别数的和
题目描述
小明对数位中含有2、0、1、9 的数字很感兴趣(不包括前导0)
在1到40中这样的数包括1、2、9、10 至32、39 和40,共28 个,他们的和是574。
请问,在1到n 中,所有这样的数的和是多少?
输入格式
输入一个正整数n(1<=n<=10000)
输出格式
输出一行,包含一个整数,表示满足条件的数的和。
输入样例 复制
40
输出样例 复制
574
解题思路:
暴力求解
代码:
#include<bits/stdc++.h>
using namespace std;
bool panduan(int n)
{
while(n)
{
if(n%10==2||n%10==0||n%10==1||n%10==9)
return true;
n/=10;
}
return false;
}
int main()
{
int n;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++)
{
if(panduan(i))
sum+=i;
}
cout<<sum;
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。
解题思路:
想求出最少的项,就必须保证求出最大的公差,对数列进行排序,我们知道,后面的每一项和第一项的差都是公差的最小公倍数,所以,我们求出它们之间的差值,然后求出这些差值中的最大公约数就可以。
代码:
#include<bits/stdc++.h>
using namespace std;
long long int a[100010];
#define INF 0x3f3f3f3f
long long int b[100010];
int main()
{
int n;
cin>>n;
long long int minnum=INF;
long long int maxnum=-INF;
for(int i=1;i<=n;i++)
{
cin>>a[i];
minnum=min(minnum,a[i]);
maxnum=max(maxnum,a[i]);
}
sort(a+1,a+n+1);
long long int maxy=INF;
int k=1;
for(int i=2;i<=n;i++)
{
b[k++]=a[i]-a[1];
}
int f=0;
for(int i=2;i<k;i++)
{
if(b[i-1]==0||b[i]==0)
{
f=1;
break;
}
maxy=min(maxy,__gcd(b[i],b[1]));
}
//cout<<maxy<<endl;
int m;
if(f)
{
m=n;
}
else
m=(maxnum-minnum)/(maxy)+1;
//else
cout<<m;
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
解题思路:
如果没有负号,那么就是直接将所有的数相加即可;
若既有负号又有正号,那么必然会有最大的数-最小的数,然后其余的数直接用绝对值相加;
代码:
#include<bits/stdc++.h>
using namespace std;
long long int b[200100];
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n+m+1;i++)
{
long long int x;
cin>>x;
b[i]=x;
}
long long int sum=0;
if(!m)
{
for(int i=1;i<=n+m+1;i++)
sum+=b[i];
cout<<sum;
return 0;
}
sort(b+1,b+n+m+2,cmp);
sum+=b[1];
sum-=b[n+m+1];
for(int i=2;i<n+m+1;i++)
sum+=abs(b[i]);
cout<<sum;
return 0;
}
最后一道编程题看到题目就果断放弃了,还有一个填空题迷宫,没写,迷宫后期会补上。