蓝桥杯|知识点|时间复杂度|排列字母|纸张尺寸|平方和|成绩统计|推荐题目

1. 比赛流程、环境

  1. 赛程
    1. 春季:省赛、决赛
    2. 省赛一等奖参加决赛
    3. 比赛时长4小时
  2. 竞赛形式
    1. 个人赛,一人一机,全程机考
    2. 答题过程中无法访问互联网
    3. 不允许携带任何电子、纸质资料
  3. C++组选手机器环境
    1. Dev-cpp 5.4.0 C/C++ API帮助文档
    2. 代码补全
      1. Ctrl+Space

2. 常考和必考知识点

  1. 杂题,不需要算法和数据结构,只需要逻辑、推理的题目,难度可难可易。考察思维能力和编码能力,只能通过大量做题来提高
  2. BFS搜索和DFS搜索,也就是暴力搜索,这时非常基本的算法,是基础中的基础
  3. 动态规划,线性DP,以及一些DP应用,例如状态压缩DP、树形DP等
  4. 简单数学和简单数论
  5. 简单的字符串处理、输入输出,简单图论
  6. 基本算法,例如排序、排列、二分、倍增、差分、贪心
  7. 基本数据结构,队列、栈、链表、二叉树

3.API帮助文档

学会使用API,就可以少记很多函数和工具

无论是在算法学习还是以后的行业工作,看懂API是一个必备的能力

时间复杂度

时间复杂度

给你n个数据

如果只有一个1-n的循环,就是线性阶O(n)

n个数据的二分查找,每次取一半,O(log2n)

如果外层是n循环,内层是二分的,就是O(nlog~2~n)

如果外层循环是1-n的,内层也是1-n的,就是平方阶O(n^2^)

常见的时间复杂度量级如下:
常数阶 O ( 1 ) < 对数阶 O ( log ⁡ 2 n ) < 线性阶 O ( n ) < 线性对数阶 O ( n log ⁡ 2 n ) < 平方阶 O ( n 2 ) < 立方阶 O ( n 3 ) < k 次方阶 O ( n k ) < 指数阶 O ( 2 n ) < 阶乘阶 O ( n ! ) < O ( n n ) \begin{array}{} 常数阶O(1)<对数阶O(\log2n)<线性阶O(n)<线性对数阶O(n\log2n) \\ <平方阶O(n^2)<立方阶O(n^3)<k次方阶O(n^k)<指数阶O(2^n) \\ <阶乘阶O(n!)<O(n^n) \end{array} 常数阶O(1)<对数阶O(log2n)<线性阶O(n)<线性对数阶O(nlog2n)<平方阶O(n2)<立方阶O(n3)<k次方阶O(nk)<指数阶O(2n)<阶乘阶O(n!)<O(nn)

怎么判断使用的算法对用测试用例的数据规模能不能过

对于O(n),10^5^,也是小,如果电脑比较好,或者代码冗余度比较低,相当于每次只做一次运算的话,最多能过10^9^,但是是不稳定的状态,1秒之内一定能过10^8^的数据(C++)

线性阶的话,N<=10^8^就可以

O(nlog~2~n)的话,N<=10^6^甚至10^5^

O(n^2^)的话,10^4^就很可能过不了了
如何计算时间复杂度

先看有几个循环

两个循环都是1-n,就是O(n^2^)

题目里是10^6^,带进去,就超了10^8^了,过不了,这个算法就不是这个题目的正解

不会正解的情况下可以通过暴力的方式去做,争取多拿分

时间复杂度就是判断这个算法是不是这个题目的正解

  1. 结果填空
    把答案直接通过网页提交,不要书写多余的内容,每题10分
  2. 程序设计
    每道题目多个测试数据,20%-40%是弱测试数据,其他是强测试数据
    题量大、时间紧张,难题往往不会做或来不及用高效算法,用暴力方法编程得20%-40%的分数
    每题10-25分

题目

1. 排列字母

问题描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可

小蓝要把一个字符串中的字母按其在字母表中的顺序排列。

例如,LANQIAO 排列后为 AAILNOQ.

又如,GOODGOODSTUDYDAYDAYUP 排列后为 AADDDDDGGOOOOPSTUUYYY.

请问对于以下字符串,排列之后字符串是什么?WHERETHEREISAWILLTHEREISAWAY

题解

直接对字符串进行排序即可,使用标准排序函数

C++使用sort标准库函数

代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
	string a = "WHERETHEREISAWILLTHEREISAWAY";
	sort(a.begin(),a.end());
	cout << a;
	return 0;	
}

2.纸张尺寸

问题描述

在 IS0 国际标准中定义了 A0 纸张的大小为 1189mm x841mm,将 A0 纸沿长边对折后为 A1纸,大小为 841mm x594mm,在对折的过程中长度直接取 下整 (实际裁剪时可能有损耗)。将 A1 纸沿长边对折后为 A2 纸,依此类推。

输入纸张的名称,请输出纸张的大小。

输入格式

输入一行包含一个字符串表示纸张的名称,该名称一定是A0、A1、A2、A3、A4、A5、A6、A7、A8、A9 之一。

输出格式

输出两行,每行包含一个整数,依次表示长边和短边的长度,

题解

根据题意维护长边长度a和短边长度b

对于输入A0而言,a=1189,b=841

根据输入的A后面的数字X,循环x次

每次让长边a除以2(向下取整),短边b不变

然后再根据a,b的大小关系进行调整,如果a<b则交换a,b

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

int main()
{
	char c;
	int x;
	cin >> c >> x; //先输入字符A,再输入纸张类型x
	//维护a,b
	int a = 1189, b = 841;
	while (x--)
	{
		a /= 2;
		if (a < b)
			swap (a, b);
	}
	cout << a << endl;
	cout << b << endl;
	return 0;
}
  • 如果有100W次查询怎么办
    1 0 8 ⋅ 10 = 1 0 9 10^8\cdot10=10^9 108⋅10=109,肯定过不了,爆了
    这时候可以先存起来,建立V和L两个数组,0的时候就是1189和841,1的时候就是841和594,把A0到A9全部存到数组里面,输入x就直接输出对应的数组下标的值
    输入输出是 O ( 1 ) O(1) O(1),整个的时间复杂度是 O ( n ) O(n) O(n)。

3. 平方和

问题描述

小明对数位中含有2,0,1,9的数字很感兴趣,在1-40中这样的数包括1,2,9,10至32,39和40,共28个,他们的和是574,平方和是14362

请问,在1到2019中,所有这样的数的平方和是多少?

题解

逐个判断一个数字的每一位

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

int main()
{
	long long sum = 0;
	for (int i = 1; i <= 2019; i++)
	{
		int t = i;
		while (t)
		{
			if (t%10 == 2 || t%10 == 0 || t%10 == 1 || t%10 == 9 ||)
			{
				sum += i*i;
				break;
			}
			t /= 10;
		}
	}
	cout << sum;
}

4. 成绩统计

题目描述

小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。

如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。

请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。

输入描述

输入的第一行包含一个整数 n ( 1 ≤ n ≤ 1 0 4 ) n(1 \le n \le 10^4) n(1≤n≤104),表示考试人数。

接下来 n n n 行,每行包含一个0至 100 的整数,表示一个学生的得分。

输出描述

输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分四舍五入保留整数。

补充

4舍6入5留双

3.254 -> 3.25

3.256 -> 3.27

3.2551 -> 3.25

3.2552 -> 3.26

题解
  • 简单模拟题
  • 用cnt1表示及格的人数,cnt2表示优秀的人数,答案即为cnt1/n,cnt2/n,四舍五入后 x 100
  • 百分号别忘记输出
代码
#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n, x, cnt1 = 0, cnt2 = 0;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> x;
		if (x >= 60)
			cnt1++;
		if (x >= 85)
			cnt2++;
	}
	cout << setprecision(0) << fixed << (1.0*cnt1/n*100) << "%\n" << (1.0*cnt2/n*100) << "%\n";
}
  • 用100.0乘,把整型数变成浮点数

推荐题目

题名 题名
冰雹数 机器人繁殖
k倍区间 图形排版
三元组中心问题 洁净数
螺旋矩阵 倍数问题
递增三元组 特别数的和
打印十字图 拉马车
打印大X 小计算器
饮料换购 音节判断
凯撒加密 最长递增
次数差 螺旋折线
旋转 连号区间数
四平方和 日期问题
奇怪的数列 数位递增的数
反倍数 最大距离
积木 等腰三角形
缩位求和 Fibonacci数列
分糖果
题库 - 蓝桥云课 (lanqiao.cn)
相关推荐
机器视觉知识推荐、就业指导2 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
Yang.993 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
熬夜学编程的小王4 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
zz40_4 小时前
C++自己写类 和 运算符重载函数
c++
六月的翅膀4 小时前
C++:实例访问静态成员函数和类访问静态成员函数有什么区别
开发语言·c++
liujjjiyun4 小时前
小R的随机播放顺序
数据结构·c++·算法
¥ 多多¥4 小时前
c++中mystring运算符重载
开发语言·c++·算法
天若有情6735 小时前
c++框架设计展示---提高开发效率!
java·c++·算法
ahadee6 小时前
蓝桥杯每日真题 - 第19天
c语言·vscode·算法·蓝桥杯