目录
1.A的个数
1.以下是一个 25 行 25 列的字母矩阵,全部由字母 A 和 B 组成。
AAAAAAABABBAABABABAAAAAAA
ABBBBBABBAABBBBBABABBBBBA
ABAAABABBBABAABBBBABAAABA
ABAAABABBBBBAABAABABAAABA
ABAAABABBABABBABABABAAABA
ABBBBBABBBABAABBBBABBBBBA
AAAAAAABABABABABABAAAAAAA
BBBBBBBBABAABABBBBBBBBBBB
AABAABABBAAABBAAABABBBBBA
ABBABABBBABBAAAABBBBAAAAB
BBBBAAABABAABABAABBBAABBA
BBAABABABAAAABBBAABBAAAAA
ABABBBABAABAABABABABBBBBA
AAAABBBBBABBBBAAABBBABBAB
AABAABAAABAAABAABABABAAAA
ABBBBBBBBABABBBBABAABBABA
ABBBAAABAAABBBAAAAAAABAAB
BBBBBBBBABBAAABAABBBABBAB
AAAAAAABBAAABBBBABABAABBA
ABBBBBABBAABABAAABBBABBAA
ABAAABABABBBAAAAAAAAAABAA
ABAAABABABABBBABBAABBABAA
ABAAABABBABBABABAABAABAAA
ABBBBBABABBBBBABBAAAABAAA
AAAAAAABAABBBAABABABBABBA
请问在这个矩阵中有多少个字母A?
这题完全不需要编程,只需要复制上述字母矩阵至word文档中,在编辑中,查找即可。
2.最2数字
如果一个整数的某个数位包含 2 ,则称这个数为一个“最2数字”。例如:102、2021 都是最2数字。请问在 1(含) 到 2021(含) 中,有多少个最2数字。
#include<bits/stdc++.h>
using namespace std;
int cnt;
int main()
{
for(int i = 1;i<=2021;i++){
int temp = i;
while(temp){
if(temp%10 == 2){
cnt++;
break;
}
temp/=10;
}
}
cout<<cnt<<endl;
return 0;
}
3.最少次数
有一个整数 A=2021,每一次,可以将这个数加 1 、减 1 或除以 2,其中除以 2 必须在数是偶数的时候才允许。
例如,2021 经过一次操作可以变成 2020、2022。
再如,2022 经过一次操作可以变成 2021、2023 或 1011。
请问,2021 最少经过多少次操作可以变成 1。
#include<bits/stdc++.h>
using namespace std;
bool vis[2025];
int bfs(int x){
queue<int> q;
q.push(x);
int cnt = 0;
while(!q.empty()){
int size = q.size();
while(size--){
int curr = q.front();
q.pop();
if(curr == 1) return cnt;
if(!vis[curr + 1]){
vis[curr+1] = 1;
q.push(curr+1);
}
if(!vis[curr-1]){
vis[curr-1] = 1;
q.push(curr-1);
}
if(curr%2 == 0&& !vis[curr/2]){
vis[curr/2] = 1;
q.push(curr/2);
}
}
cnt++;
}
}
int main()
{
cout<<bfs(2021)<<endl;
return 0;
}
4.超大玉螺旋丸
对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。
例如,一个 4 行 5 列的螺旋矩阵如下:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
请问,一个 30 行 30 列的螺旋矩阵,第 20 行第 20 列的值是多少?
#include<bits/stdc++.h>
using namespace std;
int a[35][35];
int main()
{
int n = 30*30,num = 1;
int l = 0,r = 29,t = 0,b = 29;
while(num <= n){
for(int i = l;i<=r;i++){
a[t][i] = num++;
}
t++;
for(int i = t;i<=b;i++){
a[i][r] = num++;
}
r--;
for(int i = r;i>=l;i--){
a[b][i] = num++;
}
b--;
for(int i = b;i>=t;i--){
a[i][l] = num++;
}
l++;
}
cout<<a[19][19]<<endl;
return 0;
}
5.二叉树的最大深度
一棵二叉树有2021个结点。该树满足任意结点的左子树结点个数和右子树的结点个数之差最多为1。定义根结点的深度为0,子结点的深度比父结点深度多1。
请问,树中深度最大的结点的深度最大可能是多少?左子树结点个数和右子树的结点个数之差最多为1,可以知道该树为完全二叉树。log(2021) = 11,根节点的深度为0,则该二叉树最大深度为10.
6.和尚挑水
问题描述
一个和尚要挑水,每次最多能挑 a 千克,水缸最多能装 t 千克,开始时水缸为空。
请问这个和尚最少要挑多少次可以将水缸装满?输入格式
输入一行包含两个整数 a, t,用一个空格分隔。
输出格式
输出一行包含一个整数,表示答案。
样例输入
20 2021
样例输出
102
评测用例规模与约定
对于所有评测用例,1 <= a <= 100,1 <= t <= 10000。
#include<bits/stdc++.h>
using namespace std;
int a,t;
int cnt;
int main(){
cin>>a>>t;
cnt = t/a;
if(t%a) cnt++;
cout<<cnt<<endl;
return 0;
}
7.金融数字
问题描述
在金融领域,通常将金额的百位和千位之间、十万位和百万位之间增加逗号(千分位分隔符),以方便阅读。一般从个位开始,每三位之前增加一个逗号。
例如:1234567890.00 通常写成 1,234,567,890.00。
注意小数点后固定保留 2 位。
给定一个包含千分位分隔符的数值,请读入后输出对应的不含千分位的数值,小数点仍然保留 2 位。输入格式
输入一行包含一个由千分位分隔符的数值,恰好有 2 位小数。
输出格式
输出不含千分位分隔符的数值,保留 2 位小数。
样例输入
1,234,567,890.00
样例输出
1234567890.00
评测用例规模与约定
对于所有评测用例,给定的数值整数部分不超过12位。
#include<bits/stdc++.h>
using namespace std;
char a1[20],a2[13];
int t = 0;
int main()
{
cin>>a1;
int len = strlen(a1);
for(int i = 0;i<len;i++){
if(a1[i] != ','){
a2[t++] = a1[i];
}
}
cout<<a2<<endl;
return 0;
}
8.插座
问题描述
小蓝有一个插板,形状用一个 n * m 的01矩阵表示,0 表示板面,1 表示插孔。
小蓝还有一个插头,形状用一个 r * c 的01矩阵表示,0 表示没有伸出的部分,1 表示伸出的部分。插头伸出的部分必须插在插孔里面。
为了安全,插头插到面板上不能有任何部分超过插板边界(包括没有伸出的部分)。
插头和插板都不能旋转,也不能翻转。请求出插头插入插板的合理位置。输入格式
输入的第一行包含两个整数 n, m。
接下来 n 行,每行一个长度为 m 的01串,表示插板的形状。
接下来一行包含两个整数 r, c。
接下来 r 行,每行一个长度为 c 的01串,表示插头的形状。输出格式
如果插头没办法安全插入插板中,输出“NO”。否则输出两个数 a, b,表示插头的第 1 行第 1 列对应插板的第 a 行第 b 列。如果有多种情况满足要求,输出 a 最小的方案,如果 a 最小的方案有多个,输出在 a 最小的前提下 b 最小的方案。
样例输入
3 4
0110
0000
0000
3 3
000
010
000样例输出
NO
样例说明
在插头不超出范围的前提下无法插入。
样例输入
4 7
1110100
1101111
0001111
0000011
2 3
111
011样例输出
2 4
评测用例规模与约定
对于 50% 的评测用例,2 <= n, m, r, c <= 20。
对于所有评测用例,2 <= n, m, r, c <= 100。
#include<bits/stdc++.h>
using namespace std;
int n,m,r,c;
char a[105][105],b[105][105];
bool check(int x,int y) {
for(int i = 0; i<r; i++) {
for(int j = 0; j<c; j++) {
if(b[i][j] != a[i+x][j+y]) return false;
}
}
return true;
}
int main() {
int flag = 1;
cin>>n>>m;
for(int i = 0; i<n; i++) {
for(int j = 0; j<m; j++) {
cin>>a[i][j];
}
}
cin>>r>>c;
for(int i = 0; i<r; i++) {
for(int j = 0; j<c; j++) {
cin>>b[i][j];
}
}
for(int i = 0; i<n-r+1; i++) {
for(int j = 0; j<m-c+1; j++) {
if(check(i,j)){
cout<<i<<" "<<j<<endl;
flag = 0;
}
}
}
if(flag) cout<<"NO"<<endl;
return 0;
}
9.公约数
给定正整数 a, b, c,请问有多少个正整数,是其中至少两个数的约数。
输入格式
输入一行包含三个正整数 a, b, c。
输出格式
输出一行包含一个整数,表示答案。
样例输入
30 70 35
样例输出
6
样例说明
1、2、5、7、10、35满足条件。
评测用例规模与约定
对于 50% 的评测用例,1 <= a, b, c <= 1000000。
对于所有评测用例,a, b, c 不超过 10**12(10的12次方)。
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
set<int> s1;
set<int> s2;
set<int> anser;
int main()
{
cin>>a>>b>>c;
for(int i = 1;i<=a;i++){
if(a%i == 0){
s1.insert(i);
s1.insert(a/i);
}
}
for(int i = 1;i<=b;i++){
if(b%i == 0){
s2.insert(i);
s2.insert(b/i);
if(s1.count(i)) anser.insert(i);
if(s1.count(b/i)) anser.insert(b/i);
}
}
for(int i = 1;i<=c;i++){
if(c%i==0){
if(s1.count(i)||s2.count(i)) anser.insert(i);
if(s1.count(c/i)||s2.count(c/i)) anser.insert(c/i);
}
}
cout<<anser.size();
return 0;
}
10.汉诺塔
问题描述
小蓝很喜欢玩汉诺塔游戏。
游戏中有三根柱子,开始时第一根柱子上有 n 个圆盘,从上到下圆盘的大小依次为 1 到 n。
每次,可以将一个盘子从一根柱子上移动到另一根柱子上,这个盘子必须是柱子最上方的盘子,而且移到的柱子上的盘子必须比这个盘子大。(就是上面的要比下面的盘子小)
小蓝的目标是将所有的盘子移动到第三根柱子上。
汉诺塔是个经典问题,当盘子数量为 n 时,最少需要移动 2**n-1 步,其中 2**n 表示 2 的 n 次方。
小蓝已经玩了一会儿(不一定按最优方案玩),他想知道,对于他目前的局面,最少还需要多少步可以到达目标。输入格式
输入的第一行包含三个非负整数 a, b, c,分别表示目前每根柱子上的盘子数。在本题中,n=a+b+c。
第二行包含 a 个整数,相邻的整数之间使用一个空格分隔,表示第一根柱子上的盘子,盘子按从上到下(从小到大)的顺序给出。
第三行包含 b 个整数,相邻的整数之间使用一个空格分隔,表示第二根柱子上的盘子,盘子按从上到下(从小到大)的顺序给出。
第四行包含 c 个整数,相邻的整数之间使用一个空格分隔,表示第三根柱子上的盘子,盘子按从上到下(从小到大)的顺序给出。输出格式
输出一行包含一个整数,表示答案。
样例输入
1 2 3
1
2 3
4 5 6样例输出
7
评测用例规模与约定
对于 30% 的评测用例,2 <= n <= 5。
对于所有评测用例,2 <= n <= 60。这题没思路。