1. 比赛流程、环境
- 赛程
- 春季:省赛、决赛
- 省赛一等奖参加决赛
- 比赛时长4小时
- 竞赛形式
- 个人赛,一人一机,全程机考
- 答题过程中无法访问互联网
- 不允许携带任何电子、纸质资料
- C++组选手机器环境
- Dev-cpp 5.4.0 C/C++ API帮助文档
- 代码补全
- Ctrl+Space
2. 常考和必考知识点
- 杂题,不需要算法和数据结构,只需要逻辑、推理的题目,难度可难可易。考察思维能力和编码能力,只能通过大量做题来提高
- BFS搜索和DFS搜索,也就是暴力搜索,这时非常基本的算法,是基础中的基础
- 动态规划,线性DP,以及一些DP应用,例如状态压缩DP、树形DP等
- 简单数学和简单数论
- 简单的字符串处理、输入输出,简单图论
- 基本算法,例如排序、排列、二分、倍增、差分、贪心
- 基本数据结构,队列、栈、链表、二叉树
3.API帮助文档
学会使用API,就可以少记很多函数和工具
无论是在算法学习还是以后的行业工作,看懂API是一个必备的能力
时间复杂度
时间复杂度
给你n个数据
如果只有一个1-n的循环,就是线性阶O(n)
n个数据的二分查找,每次取一半,O(log2n)
如果外层是n循环,内层是二分的,就是O(nlog2n)
如果外层循环是1-n的,内层也是1-n的,就是平方阶O(n2)
常见的时间复杂度量级如下:
常数阶
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),105,也是小,如果电脑比较好,或者代码冗余度比较低,相当于每次只做一次运算的话,最多能过109,但是是不稳定的状态,1秒之内一定能过108的数据(C++)
线性阶的话,N<=108就可以
O(nlog2n)的话,N<=106甚至105
O(n2)的话,104就很可能过不了了
如何计算时间复杂度
先看有几个循环
两个循环都是1-n,就是O(n2)
题目里是106,带进去,就超了108了,过不了,这个算法就不是这个题目的正解
不会正解的情况下可以通过暴力的方式去做,争取多拿分
时间复杂度就是判断这个算法是不是这个题目的正解
- 结果填空
把答案直接通过网页提交,不要书写多余的内容,每题10分 - 程序设计
每道题目多个测试数据,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) |