第十一届蓝桥杯校内模拟赛

题目

1. 15.125GB

问题描述

【问题描述】
在计算机存储中,15.125GB是多少MB?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


题解

此题和蓝桥杯第11次大赛的第一天相似,15.125GB = 15.125 * 1024 MB = 15,488MB

1B=8bit
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB

答案

15488

2. 约数个数

【问题描述】
1200000有多少个约数(只计算正约数)。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


题解

要求约数的个数,可以从一循环到1200000,统计出能够被1200000整除的数字的个数。

#include <iostream>
using namespace std;

int main(){
    int cnt;
	
	for(int i = 1;i<=1200000;i++){
		if(1200000 % i == 0)
			cnt++;
	} 
	cout << cnt << endl;
	
	return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

答案

96

3. 叶结点数

问题描述

【问题描述】
一棵包含有2019个结点的二叉树,最多包含多少个叶结点?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


题解

二叉树的一个性质是第 i 层上最多有 2^i-1 个结点(i>=1),这样我们可以得出二叉树每一层的结点个数,叶结点是没有左右子树的,所以我们首先需要知道第2019个结点在二叉树上的位置,才能得到最后的答案。

#include <iostream>
#include <math.h>
//#include<bits/stdc++.h> 
using namespace std;

int main(){
	double n;
	int i;
	double cnt = 0;
	cin >> n;
	for(i = 1; cnt <= n; i++){
		cnt = pow(2.0,i-1) + cnt;
	}
	cout << i-1;
	return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

这段代码可以求出第 N 个结点在二叉树的第几层,i 代表层数,可以求出第2019个结点在二叉树的第十一层,第一层到第十层共计有 2^0 + 2^1 + 2^2 + ... + 2^9 = 1023 个结点,第一层到第十一层共有 2047 个结点。确定了第 2019 个结点在第十一层,那么第 2019 个结点在第十一层的哪里呢? 前十层占据了1023 个结点,那么就可以知道第 2019 个结点在第十一层的第 2019 - 1023 个位置处。也就是第 996 个结点,第十一层的 996 个结点占据了第十层的 996 / 2 个结点,也就是第十层有 498 个父结点,那么第十层一共有 512 个结点,其中有 498 个有叶子结点,那么还剩 512 - 498(14) 个叶子节点,总共的叶子结点就是第十一层的 996 个加上第十层的 14 个,一共 1010 个叶子节点。所以答案为1010。

答案

1010

4. 数字9

问题描述

【问题描述】
在1至2019中,有多少个数的数位中包含数字9?
注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算只是算一个数。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。



题解

#include <bits/stdc++.h>
using namespace std;

int main(){
	int cnt = 0;
	int n = 2019;
	while(n--){
		string s = to_string(n); //to_string 编译时需要c++11支持 
		if(s.find('9') != string::npos)
			cnt++;
	}
	cout << cnt;
	
	return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

答案

543

5. 数位递增的数

问题描述

【问题描述】
一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。
给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
【输入格式】
输入的第一行包含一个整数 n。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
30
【样例输出】
26
【评测用例规模与约定】
对于 40% 的评测用例,1 <= n <= 1000。
对于 80% 的评测用例,1 <= n <= 100000。
对于所有评测用例,1 <= n <= 1000000。


思路

借助于转化字符串方便的原因,我们把数字转化为字符串,然后两两相邻的数字比较,若出现前面的数字小于后面的就可以确定这个数字不是递增的数,统计数量即可。

源代码

#include <bits/stdc++.h>
using namespace std;

int main(){
	int n, cnt = 0;
	
	cin >> n;
	
	for(int i = 1;i <= n;i++){
		string s = to_string(i);
		bool flag = true;
		for(int j = 0; j < s.length() -1;j++){
			if(s[j] > s[j + 1])
				flag = false;
				break;
		}
		if(flag)
			cnt++;
	}
	
	cout << cnt;
	return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

6. 递增三元组

问题描述

【问题描述】
在数列 a[1], a[2], ..., a[n] 中,如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。
给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
【输入格式】
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a[1], a[2], ..., a[n],相邻的整数间用空格分隔,表示给定的数列。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
5
1 2 5 3 5
【样例输出】
2
【样例说明】
a[2] 和 a[4] 可能是三元组的中心。
【评测用例规模与约定】
对于 50% 的评测用例,2 <= n <= 100,0 <= 数列中的数 <= 1000。
对于所有评测用例,2 <= n <= 1000,0 <= 数列中的数 <= 10000。

思路

本题有规定评测用例规模,对于 50% 的用例 2 <= n <= 100,0 <= 数列中的数 <= 1000。则证明如果用暴力法,最多得到一半的分数。如果实在没有思路的话可以用暴力法。暴力法需要三重循环,如果不用暴力法的话,就需要一些技巧。

源代码


暴力法(三重循环)

#include <iostream>
#include <algorithm>
using namespace std;
int a[1005];
int b[1005];
int main()
{
	int n, ans = 0;//计数
	int ind = 1;//用于存放符合条件的三元组中心的下标
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];

	for (int i = 1; i <= n - 2; i++)
	{
		for (int j = i + 1; j <= n - 1; j++)
		{
			for (int k = j + 1; k <= n; k++)
			{
				//如果满足题意,则将三元组中心的下标存入数组中
				if (a[i] < a[j] && a[j] < a[k])
				{
					b[ind++] = j;
				}
			}
		}
	}
	
	//对存放入数组中的不同下标进行计数
	sort(b, b + ind);
	for (int i = 1; i < ind; i++)
	{
		if (b[i] != b[i - 1]) ans++;
	}
	cout << ans;
	return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

双重循环

#include <iostream>
using namespace std; 
const int N = 1005;
int n, p[N], ans;
bool ok(int x) {
	bool ok = false;    //初始化 ok 的值
	for (int i = x - 1; i >= 1; i--) {
		if (p[i] < p[x]) {       //判断 x 前面是否存在小于p[x]的的元素 
			ok = true; break;    //若存在,ok=true,退出循环,因为只要找到一个是小于 x 的就行,不用一直循环到p数组的第一个元素 
		}
	}
	if (!ok) return false;       //判断 x 前面是否有比p[x]小的元素,如果没有则直接返回false,证明没有递增三元组 
	for (int i = x + 1; i <= n; i++) {  
		if (p[x] < p[i]) return true;  //判断 x 后面是否有大于p[x]的元素 
	}
	return false;
}
int main() {
 	cin >> n;
 	for (int i = 1; i <= n; i++) {
		cin >> p[i];        //数据的输入,下标从 1 开始 
	}
	for (int i = 1; i <= n; i++) {
		if (ok(i)) ans++;
	}
 	cout << ans;    
	return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

7. 音节判断

问题描述

【问题描述】
小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。
给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。
元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。
【输入格式】
输入一行,包含一个单词,单词中只包含小写英文字母。
【输出格式】
输出答案,或者为yes,或者为no。
【样例输入】
lanqiao
【样例输出】
yes
【样例输入】
world
【样例输出】
no
【评测用例规模与约定】
对于所有评测用例,单词中的字母个数不超过100。

思路

结构为辅音元音辅音元音的单词输出 yes ,否则输出 no ,则可以一个一个的判断。

源代码

#include <bits/stdc++.h>
using namespace std;

bool ok(char c){
	if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
		return true;
	return false;
}

int main(){
	string str;
	int step = 0;
	
	cin >> str;
	
	for(int i = 0;i < str.size();i++){
		if(step == 0){
			if(!ok(str[i])) step = 1; //判断第一段是否为辅音,如果是辅音则step = 1,是元音的话则继续判断下一个字符 
		}
		if(step == 1){
			if(ok(str[i])) step = 2;  //判断第二段是否为元音,如果是元音就step = 2, 是辅音的话则判断下一个字符 
		}
		if(step == 2){
			if(!ok(str[i])) step = 3; //判断第三段是否为辅音,如果是辅音则step = 1,是元音的话则继续判断下一个字符 
		}
		if(step = 3){
			if(ok(str[i])) step = 4;  //判断第四段是否为辅音,如果是辅音则step = 1,是元音的话则继续判断下一个字符 
		}	
	}
	if(step == 4)
		cout << "yes" <<endl;
	else
		cout << "no" <<endl;
	
	return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37