试题 B: 年号字串 本题总分:5 分
【问题描述】 小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26。对于 27 以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27,AB 对 应 28,AZ 对应 52,LQ 对应 329。 请问 2019 对应的字符串是什么?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个大写英文字符串,在提交答案时只填写这个字符串,注意全部大写,填写多 余的内容将无法得分。
试题 B: 年号字串
题意:考察26进制,用短除法自己做做吧
答案:BYQ
我自己的思路是:不断的除以26
问题描述】 给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求 第 20190324 项的最后 4 位数字。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个 4 位整数(提示:答案的千位不为 0),在提交答案时只填写这个整数,填写 多余的内容将无法得分。
思路这道题比较简单想一下,它要求的是后四位 只需要对每次相加的结果对1000求偶余,因为每次求余它不会影响后四位
#include <iostream>
#include <bitset>
#include <algorithm>
#include <vector>
#include <map>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <queue>
using namespace std;
int a[21190323];
void form()
{
a[0]=a[1]=a[2]=1;
for(int i=3;i<21190323;i++)
{
a[i]=a[i-1]+a[i-2]+a[i-3];
if(a[i]>10000)
{
a[i]=a[i]%10000;
}
}
}
int main()
{
form();
cout<<a[20190323]<<endl;
return 0;
}
试题 D: 数的分解 本题总分:10 分
【问题描述】 把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包 含数字 2 和 4,一共有多少种不同的分解方法? 注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分
#include <iostream>
#include <bitset>
#include <algorithm>
#include <vector>
#include <map>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <queue>
using namespace std;
int paichu(int n)
{
int a=n;
while(a>0)
{
if(a%10==2||a%10==4)
{
return 0;
}
a/=10;
}
return 1;
}
int main()
{
int count=0;
for(int i=1;i<2020;i++)
for(int j=i+1;j<2020;j++)
for(int k=j+1;k<2020;k++)
{
if(i+j+k==2019)
{
if(paichu(i)&&paichu(j)&&paichu(k))
{
count++;
}
}
}
cout<<count<<endl;
return 0;
}
试题 G: 完全二叉树的权值
时间限制: 1.0s 内存限制: 256.0MB
【问题描述】给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是 A1, A2, · · · AN,如下图所示:现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。注:根的深度是 1。
【输入格式】
第一行包含一个整数 N。
第二行包含 N 个整数 A1, A2, · · · AN 。
【输出格式】
输出一个整数代表答案。
【样例输入】
7
1 6 5 4 3 2 1
【样例输出】
2
【评测用例规模与约定】
对于所有评测用例, 1 ≤ N ≤ 100000, −100000 ≤ Ai ≤ 100000。
**思路:**下一层是上一层的2倍 利用这个关系来求取结果
这个是我自己写的代码,比较麻烦,但是好理解,我自己测了好多数据,都是对的,不知道标准的怎么样
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int a[100000];
struct song{
int a;
int b;
}s[100000];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int flag=0;
//下面的If -else 是用来求二叉树有几层
if(n==1){
flag=1;
}
else{
**for(int i=0;i<100;i++){
if(n<pow(4,i)){
flag=i+1;
break;
}
}**
}
//下面的两个For循环把每个深度的相加和 和每层的深度放到结构体数组里面
int sum=0;
for(int i=1;i<=flag;i++){
sum=0;
for(int j=pow(2,i-1);j<=n&&j<pow(2,i);j++){
sum=sum+a[j];
}
s[i].a=sum;
s[i].b=i;
}
//下面的一个for循环是用来求和是最大的
int max=s[1].a;
for(int i=2;i<=flag;i++){
if(max<=s[i].a){
max=s[i].a;
}
}
最后一个For循环是用来实现他想知道哪个深度的节点权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度
for(int i=1;i<=flag;i++){
if(s[i].a==max){
cout<<s[i].b;
break;
}
}
}
试题 H: 等差数列
时间限制: 1.0s 内存限制: 256.0MB
【问题描述】数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数。
现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?
【输入格式】
输入的第一行包含一个整数 N。
第二行包含 N 个整数 A1; A2; · · · ; AN。 (注意 A1 ∼ AN 并不一定是按等差数列中的顺序给出)
【输出格式】
输出一个整数表示答案。
【样例输入】
5
2 6 4 10 20
【样例输出】
10
【样例说明】
包含 2、 6、 4、 10、 20 的最短的等差数列是 2、 4、 6、 8、 10、 12、 14、 16、18、 20。
【评测用例规模与约定】
对于所有评测用例, 2 ≤ N ≤ 100000, 0 ≤ Ai ≤ 109。
思路我的思路是这样的,分为两种情况,第一种,就是项数的每一项都是相等的,那么最小数是项数的和,如果不相等,将N个整数进行排序,最后全部的数一定在第一个元素和最后一个元素之间,依次求前后两个数的差得出最小的差就是等差数列的和但是这个思路是错误的因为在所给的数据中求差,所得的最小差不一定能构成等差数列,所以正确的思路是求得所有的数据差求最大公约数即可****
I: 后缀表达式
时间限制: 1.0s 内存限制: 256.0MB
【问题描述】给定 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。
【输出格式】
输出一个整数,代表答案。
【样例输入】
1 1
1 2 3
【样例输出】
4
【评测用例规模与约定】
对于所有评测用例, 0 ≤ N; M ≤ 100000, −109 ≤ Ai ≤ 109