作者:指针不指南吗
专栏:蓝桥杯倒计时冲刺🐾蓝桥杯加油,大家一定可以🐾
文章目录
我是菜菜,最近容易我犯的错误总结 + 一些tips
各位蓝桥杯加油加油
-
- 当输入输出数据不超过
1e6
时,scanf
printf
和cin
cout
是没有差距的; - 超过这个数据范围时,就是用
scanf
printf
- 当输入输出数据不超过
-
多次调式,自己手写几组数据,用代码测试一下
输入格式,和输出格式,逐一对照题目
用 int 还是 char 读入多组输出结果 是用空格开始换行 ,大小写是否正确
-
- dev 先开 10个 窗口,把框架打上去,做好准备,可以先 默写一个板子,试试手感
- 带不同颜色的笔,可能很有用
-
自己设置样例,把所有的临界情况,都写出来;尽可能多的,想想出题人出怎么卡你
-
- 截断的话,强制转化,double 类型
- 加 0.5 :3.5和3.6、3.4 +0.5 再强制转化,成int 截断
- 四舍五看单双 x*100%10判断它
- printf 直接包含 四舍五入
-
注意由负数和0,1,2等特殊情况,把这几个值作为样例,带入到里面去调试
-
并查集的板子,太细了,仔细看看
-
考虑边界条件,是否可以取到,是否需要多取一个
-
取最中间两个数的,表示方法记住:
[(n+1)/2]
[(n+2)/2]
认真审题!!注意到每一句话,太重要了
10.数据类型错了 应该是 double
, 我一直写的 int
, 最后才发现
- 一定要确保数据类型使用正确
- 巧用 word 和 excel ,来解答
- 数据范围,一定要明确,输入范围,不代表结果的范围,大坑
- 当 运算结果不正确的时候 Debug , 可以用一个比较小的数,从头到尾走一遍,在纸上写一写
走的时候,不要看 大致思路 , 出错往往是那些不起眼的小地方 ,每一个关键字 ,都 走一遍
-
先把逻辑再纸上写一遍,再开始写代码
-
写代码的时候,逻辑很乱,条理不清晰,提前没有写注释,后面修改的时候,就很懵
动手模拟一下,往往会事半功倍
此外,数据开的范围要足够大
-
1B(Byte 字节)=8bit,
1KB (Kilobyte 千字节)=1024B,
1MB (Megabyte 兆字节 简称“兆”)=1024KB,
1GB (Gigabyte 吉字节 又称“千兆”)=1024MB,
1TB (Trillionbyte 万亿字节 太字节)=1024GB,其中1024=2^10 ( 2 的10次方) -
sum=-1e18; //让 sum 尽可能的小,因为输入的数中含有负数
-
读题,理解他深层次的要求,明确要求什么
属于一个规律题,编号可以 推出来
-
发散性思维,在做蓝桥杯的时候,遇到这种 数 的题,先静下心来,找找规律
-
定义变量之前,先想清楚,它的数据类型和范围
-
有向无环图才会有拓扑序列,所以有向无环图又称为拓扑图,无向图没有,环也没有
入度:有几条边进入某个顶点;出度:有几条边从某个顶点出去
拓扑练习
-
注意最后的输出格式,别最后好不容易算对了,结果格式错了,太冤了
-
原来还可以使用结构体,确实简单了不少
sort函数的重载
-
^ 异或 两个位相同为0,相异为1。 ~ 取反 -
数字可以使用 string 字符串,来储存比较各个数位
-
双向和自环,注意
-
while(a[m]==0) //去掉前导0,优化 { m++; }
-
对于题中给的数据范围,要分情况分析,尤其是含有负数、0、正数的情况
-
遇到捆绑问题+排序问题的时候,使用结构体处理数据
两组数据的时候,可以使用双重数组,里面有排序的话 ,拒绝数组
-
还有就是数据很大,一律不用使用 int ,省的后期还得改
-
0x7fffffffffffffffL; // long long的最大
-
dfs 递归回溯
-
bfs 不断扩展 直到找到结果
-
全排列
-
坐标表示,(1,1)在左下角
for(int i=n; i>=1; i--) { for(int j=1; j<=m; j++) { s[i][j]=getchar(); if (s[i][j]=='.') cnt++;//统计有多少个空 } getchar(); }
-
dist、h的初始化
-
vector 二维数组:
vector<int> q[m]
表示可以往 q[1],q[2] 里面放一个数组,
q[2][3]
表示 q[2]这个数组的 第 3个元素,根据上面题中理解更透彻而且还可以 使用
q[2].size()
就很方便 -
注意谁除谁,觉得结果很离谱,就转化一下思维,从另一个角度来理解题
-
动手在纸上模拟,思路就会很清晰,千万别硬想
-
仔细阅读输出提示,-1 的情况
-
在浮点数精度问题上,和在某范围内查找某个数的时候
特别是大范围
就使用二分算法 -
1.reverse(str.begin(),str.end()) 反转字符串 2.reverse(vector.begin(),vector.end()) 反转向量 3.reverse(a,a+strlen(a)) 反转数组
-
找规律,发散思维,很有可能有递归,看看前后几个数之间的关系
递归函数,可能会超时,考试的时候,就直接使用 数组来代替函数
-
使用 switch 执行不同的函数
47.dfs 回溯+深搜+恢复现场
考试的时候,不会的题,一定要把样例写上去,骗分!
- s=to_string(n):数字转为字符串
- s=substr(start,length):复制子字符串,从指定位置开始并具有指定的长度,substr(start , length)
- n=stoi(s):字符串转为数字,stoi(字符串 , 起始位置 , n进制)
- stoi(字符串,起始位置,
n
2~32进制),将n进制的字符串转化为十进制。
-
截取全部字串
for (int i = 0; i < str.size(); i ++) for (int j = 1; j <= str.size() - i; j ++) //注意这里的细节 1、!、= -i string s = str.substr(i , j);
-
判断素数
bool prime_number(int num) //判断素数 方法一 { if (num <= 3) return num > 1; if (num % 2 == 0) return false; if (num %6 != 1 && num % 6 != 5) return false; for (int i = 3; i < sqrt(num); i += 2) if (num % i == 0) return false; return true; }
-
输出技巧:使用 flag 标记第一个数,符号带在数的前面(说的有点抽象,结合上面这个题理解)
使用 多个 if else 来判断条件,是否输出相对应的符号
-
unsigned int 0~4294967295 (10位数,4e9) int -2147483648~2147483647 (10位数,2e9 2^{31}-1) long long -9223372036854775808~9223372036854775807 (19位数, 9e18 ) 2^{63}-1 unsigned long long 0~18446744073709551615 (20位数,1e19) 2^{64} - 1 -
m是 1 0 5 10^5 105 级别的话就是稠密图,m是n级别的就是稀疏图
ps数组元素个数不能太多,一开始用的 1e5 ,编译过不去
-
进制转化问题:
- 填空题直接借助于计算器
- 编程,注意累乘的进位的顺序,别整反了;使用字符串来储存数字
- '0’是字符0的意思,他所对应的ASCII码为48;而0是数字0,ASCII中的0
-
ASCII 转换公式
0-9 A-Z a-z ASCII码值 48-57 65-90 97-122 - ASCII码值大小:数字<大写字母<小写字母
- 以上三种ASCII码因为都是连续的,所以都可以加相应的数从而得到之后的ASCII码值
- 小写转大写:小写字母 - ‘a’ + ‘A’
- 大写转小写:大写字母 - ‘A’ + ‘a’
- 小写转数字:小写字母 - ‘a’ + ‘0’
- 原值减去 原对应类型的第一个值 (置零);
- 然后加上 所求类型的第一个值的ASCII
-
从13!开始就开始爆int;
从21!开始就开始爆 long long;
高精度乘法,把小的int存
-
long double 输出用
%Lf
-
绝对值 整数时,使用 abs;浮点数,使用 fabs
-
使用万能头的话,不要使用 y1
-
三角形面积
//海伦公式 long double p=(a+b+c)/2; S=sqrt(p*(p-a)*(p-b)*(p-c)); //背过printf("%.2Lf\n",S); //这里,输出 Lf
S=fabs(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2)*1.0/2; //这里,abs的使用,面积没有负的,坐标法
-
函数来改变某个变量,记得使用 引用
-
使用邻接表的时候 h 初始化 + add ,初始化别丢
-
什么问题可以运用二分搜索算法技巧?
-
首先,你要从题目中抽象出一个自变量
x
,一个关于x
的函数f(x)
,以及一个目标值target
。 -
同时,
x
,f(x)
,target
还要满足以下条件:f(x)
必须是在x
上的单调函数(单调增单调减都可以)题目是让你计算满足约束条件
f(x) == target
时的x
的值。
-
-
利用 map 键值对来存 每一数在数组中出现的次数,然后就可以直接使用了
开 long long 不要犹豫
-
while(n) { ans++; n&=(n-1); //这里是计算 n 二进制中1的个数 }
-
直接不断地乘2,错以为每个偶数都可以包含在内,4*2=8,6就没有包含进去;
-
骗分,yes or no 二选一,运气好的话,拿一半多得分
-
学会剪枝,特殊情况,使用break 来缩短时间
-
编号坐标注意是从 0 开始还是 1 开始
-
双指针的一般思路就是,先想出来暴力朴素算法,然后使用双指针优化
各位,蓝桥杯加油!!