目录
问题一
问题描述
ASCII 码将每个字符对应到一个数值(编码),用于信息的表示和传输。在 ASCII 码中,英文字母是按从小到大的顺序依次编码的,例如:字母 A 编码是 65, 字母 B 编码是 66,字母 C 编码是 67,请问字母 Q 编码是多少?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:81
#include<iostream>
using namespace std;
int main()
{
int a;
char b;
cin>>b;
a=b;
cout<<a;
return 0;
}
问题二
问题描述
请问在 1 到 2020 中,有多少个数与 2020 互质,即有多少个数与 2020 的最大公约数为 1。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:800
//2020能被质数 2、5、101整除,遍历从1到2020有多少数是2,5,101的倍数,得到与2020不互为质数的数的个数,个数为1220,2020-1220=800
#include<iostream>
using namespace std;
int main()
{
int a,b=0;
for(int i=1;i<=2020;i++)
{
if(i%2==0||i%5==0||i%101==0)
{
b++;
}
}
cout<<2020-b<<endl;
return 0;
}
问题三
问题描述
有一棵二叉树,一个由 2021 个结点,其中有 1000 个结点有两个子结点, 其他的结点有一个或者 0 个子结点。请问,这棵二叉树有多少个叶结点?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:1001
当二叉树结点数为2021时,有2020条树枝,有两个子结点的结点数对应两个树枝,
有一个子结点的结点数对应一个树枝,那么当有2021个结点,有2020个树枝,其
中有1000个结点有两个子结点,就对应2000个树枝,还剩2020-2000 = 20个树
枝留给有一个子结点的结点数,就是2021-1000-20=1001个叶结点。
注:叶子节点个数等于度数为2的节点个数加1
问题四
问题描述
对于整数 v 和 p,定义 Pierce 序列为:
a[1] = v
a[i] = p % a[i-1]
例如,当 v = 8, p = 21 时,对应的 Pierce 序列为
a[1] = 8
a[2] = 5
a[3] = 1
再往后计算,值变为 0,不在我们考虑的范围内。因此当 v = 8, p = 21 时, Pierce 序列的长度为 3。
当 p 一定时,对于不同的 v 值,Pierce 序列的长度可能不同。当 p = 8时,若 1<=v<p,最长的 Pierce 序列出现在 v=13时,为(13, 8, 5, 1),长度为 4。
当 p=2021 时,最长的 Pierce 序列出现在 v=1160 时,请问这个序列有多长?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:12
#include<iostream>
using namespace std;
int main()
{
int v=1160,p=2021,a=1;
while(p%v!=0)
{
v=p%v;
a++;
}
cout<<a<<endl;
return 0;
}
问题五
问题描述
在 Excel 中,第 1 列到第 26 列的列名依次为 A 到 Z,从第 27 列开 始,列名有两个字母组成,第 27 列到第 702 列的列名依次为 AA 到 ZZ。
之后的列再用 3 个字母、4 个字母表示。
请问,第 2021 列的列名是什么?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个有大写字母组成的字符串,在提交答案时只填写这个字符串,填写多余的内容将 无法得分。
答案:BYS
用2021除以26得到77余19,77除以26得到2余25
可以得到2、25、19,这些数字分别对应26个英文
字母的位置就是答案:BYS
//这道题是计算26进制
#include<iostream>
using namespace std;
int main()
{
char a,b,c;
int i,j,k;
for(i=0;i<26;i++)
{
for(j=0;j<26;j++)
{
for(k=0;k<26;k++)
{
if(i*26*26+j*26+k==2021)
{
a=i+64;//加上64是因为大写英文字母在ASCII码中从65开始
b=j+64;
c=k+64;
cout<<a<<b<<c;
}
}
}
}
}
问题六
问题描述
小蓝正在写一个网页显示一个新闻列表,他需要将总共 n 条新闻显示,每页最多可以显示 p 条,请问小蓝至少需要分多少页显示?
例如,如果要显示 2021 条新闻,每页最多显示 10 条,则至少要分 203 页显示。
输入格式
输入的第一行包含一个整数 n,表示要显示的新闻条数。
第二行包含一个整数 p,表示每页最多可以显示的条数。
输出格式
输出一个整数,表示答案。
样例输入
2021
10
样例输出
203
样例输入
2020
20
样例输出
101
数据规模和约定
对于所有评测用例,1 <= n <= 10000,1 <= p <= 100。
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
cin>>a>>b;
c=a/b;
if(a%b==0)
cout<<c;
if(a%b!=0)
cout<<c+1;
return 0;
}
问题七
问题描述
在书写一个较大的整数时,为了方便看清数位,通常会在数位之间加上逗号来分割数位,具体的,从右向左,每三位分成一段,相邻的段之间加一个逗号。
例如,1234567 写成 1,234,567。
例如,17179869184 写成 17,179,869,184。
给定一个整数,请将这个整数增加分割符后输出。
输入格式
输入一行包含一个整数 v。
输出格式
输出增加分割符后的整数。
样例输入
1234567
样例输出
1,234,567
样例输入
17179869184
样例输出
17,179,869,184
数据规模和约定
对于 50% 的评测用例,0 <= v < 10^9 (10 的 9 次方)。
对于所有评测用例,0 <= v < 10^18 (10 的 18 次方)。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
cin>>s;
for(int i=s.length()-3;i>0;i-=3)
{
s=s.substr(0,i)+","+s.substr(i);//substr()函数是复制函数
}
cout<<s;
}
问题八
问题描述
杂货铺老板一共有 N 件物品,每件物品具有 ABC 三种属性中的一种或多种。 从杂货铺老板处购得一件物品需要支付相应的代价。
现在你需要计算出如何购买物品,可以使得 ABC 三种属性中的每一种都在至少 一件购买的物品中出现,并且支付的总代价最小。
输入格式
输入第一行包含一个整数 N。
以下 N 行,每行包含一个整数 C 和一个只包含"ABC"的字符串,代表购得该物 品的代价和其具有的属性。
输出格式
输出一个整数,代表最小的代价。如果无论如何凑不齐 ABC 三种属性,输出-1。
样例输入
5
10 A
9 BC
11 CA
4 A
5 B
样例输出
13
数据规模和约定
对于 50%的评测用例,1 <= N <= 20
对于所有评测用例,1 <= N<= 1000, 1<=C<=100000
//本题是飞步无人驾驶2018届校园招聘在线笔试A轮,这道题没有写出来,代码是在网上找到的
#include <bits/stdc++.h>
using namespace std;
int n;
int a[10];
int vis[3];
int c;
string s;
int main(){
scanf("%d",&n);
memset(a,0x3f3f3f3f,sizeof(a));
a[0] = 0;
for (int i = 0;i < n;++i){
scanf("%d",&c);
cin >> s;
memset(vis,0,sizeof(vis));
int cnt = 0;
for (int j = 0;j < s.length();j++){
if (s[j] == 'A' && !vis[0]){
cnt++;
vis[0] = 1;
}
if (s[j] == 'B' && !vis[1]){
cnt += 2;
vis[1] = 1;
}
if (s[j] == 'C' && !vis[2]){
cnt += 4;
vis[2] = 1;
}
}
a[cnt] = min(a[cnt],c);
}
int ans = 1e9+7;
for (int i = 0;i < 6;++i){
for (int j = 0;j < 7;++j){
for (int k = j+1;k < 8;++k){
if (a[i] == 0x3f3f3f3f || a[j] == 0x3f3f3f3f || a[k] == 0x3f3f3f3f) continue;
if (((i&1) || (j&1) || (k&1)) && ((i&2) || (j&2) || (k&2)) && ((i&4) || (j&4) || (k&4))){
ans = min(ans,a[i] + a[j] + a[k]);
}
}
}
}
if (ans == 1e9+7){
puts("-1");
}else printf("%d\n",ans);
}
问题九
问题描述
给定一个矩阵 M,由 n 行 m 列组成,第 i 行第 j 列值为 M[i][j]。
定义矩阵 M 的重量为矩阵中所有元素的和,几位 weight(M)
请找到矩阵左上角的一个子矩阵 S(矩阵的前 r 行中的前 c 列组成),使得 这个子矩阵的重量的两倍最接近矩阵 M 重量。即 |2 weight(S)-weight(M)| 最小。
如果有多个子矩阵满足条件,请找出面积 r * c 最小的一个。
如果仍然有多个子矩阵满足条件,请找出其中 r 最小的一个。
输入格式
输入第一行包含两个整数 n, m,表示矩阵的大小。
接下来 n 行,每行 m 个整数,表示给定的矩阵 M。
输出格式
输出一行,包含两个整数 r, c,表示子矩阵为矩阵 M 的前 r 行中的前 c 列。
样例输入
3 4
3 0 1
1 1 0
1 1 1
1 -2 4
样例输出
2 3
数据规模和约定
对于 30% 的评测用例,1 <= n, m <= 20, -10 <= M[i][j] <= 10。
对于 50% 的评测用例,1 <= n, m <= 100, -100 <= M[i][j] <= 100。
对于所有评测用例,1 <= n, m<= 1000, -1000 <= M[i][j] <= 1000。
1
问题十
问题描述
给定一个序列 (a_1, a_2, ..., a_n), 它的一个上升子序列是指从序列中取出一些元素,按照原来的顺序排列后,是单调递增的序列。
例如,对于序列 (3, 2, 7, 6, 7),取出下标为 2, 4, 5 的元素 a_2, a_4, a_5,即 2, 6, 7,是一个上升子序列。
在这个序列中,有 7 个长度为 2 的上升子序列,例如
1. 下标 1, 3 对应的 3, 7;
2. 下标 1, 4 对应的 3, 6;
3. 下标 1, 5 对应的 3, 7;
4. 下标 2, 3 对应的 2, 7;
5. 下标 2, 4 对应的 2, 6;
6. 下标 2, 5 对应的 2, 7;
7. 下标 4, 5 对应的 6, 7。
注意,可能有下标不同但对应数值相同的上升子序列,他们应当算成不同的上 升子序列。
给定序列,请问序列中一共有多少个长度为 k的上升子序列。
输入格式
输入第一行包含两个整数 n, k,表示序列的长度和上升子序列的长度。
第二行包含 n 个整数 a_1, a_2, ..., a_n,表示给定的序列。
输出格式
输出一行,包含一个整数,表示长度为 k 的上升子序列的数量,答案可能很大, 请输出答案除以 1000007 的余数。
样例输入
5 2
3 2 7 6 7
样例输出
7
数据规模和约定
对于 30% 的评测用例,1 <= n <= 20, 0 <= a_i <= 100。
对于 50% 的评测用例,1 <= n <= 100, 0 <= a_i <= 1000。
对于所有评测用例,1 <= n <= 1000, 1 <= k <= 10, 0 <= a_i <= 100
1
问题十一
问题描述
斐波那契数列是这样一个数列:它的第一项和第二项都是1,从第三项开始每一项都是前两项的和。
根据以上定义,我们容易计算出斐波那契数列的前几项依次是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ……
现在请你计算斐波那契数列第N项是奇数还是偶数?
输入格式
输入的包含一个整数N。
输出格
如果是奇数输出1,是偶数输出0。
样例输入
10
样例输出
1
提示
找规律。
数据规模和约定
对于所有评测用例,1 <= N <= 1000000000。
//斐波那契数列的数字规律是奇奇偶
#include<stdio.h>
int fun(int n)
{
if(n==1||n==2)
return 1;
else
return fun(n-1)+fun(n-2);
}
int main()
{
int n;
scanf("%d",&n);
if(n%3==0)
printf("0");
else
printf("1");
return 0;
}
这些试题中第八题、第九题、第十题没有写出来,等写出来之后会补充。
如果在试题解答代码中有错误,希望大家能够指出来,非常感谢。