作者:指针不指南吗
专栏:蓝桥杯倒计时冲刺蓝桥杯加油,大家一定可以
我是菜菜,最近容易我犯的错误总结 + 一些tips
各位蓝桥杯加油加油
1e6
时,scanf
printf
和cin
cout
是没有差距的;scanf
printf
多次调式,自己手写几组数据,用代码测试一下
输入格式,和输出格式,逐一对照题目
用 int 还是 char 读入多组输出结果 是用空格开始换行 ,大小写是否正确
自己设置样例,把所有的临界情况,都写出来;尽可能多的,想想出题人出怎么卡你
注意由负数和0,1,2等特殊情况,把这几个值作为样例,带入到里面去调试
并查集的板子,太细了,仔细看看
考虑边界条件,是否可以取到,是否需要多取一个
取最中间两个数的,表示方法记住:[(n+1)/2]
[(n+2)/2]
认真审题!!注意到每一句话,太重要了
10.数据类型错了 应该是 double
, 我一直写的 int
, 最后才发现
走的时候,不要看 大致思路 , 出错往往是那些不起眼的小地方 ,每一个关键字 ,都 走一遍
先把逻辑再纸上写一遍,再开始写代码
写代码的时候,逻辑很乱,条理不清晰,提前没有写注释,后面修改的时候,就很懵
动手模拟一下,往往会事半功倍
此外,数据开的范围要足够大
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 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 回溯+深搜+恢复现场
考试的时候,不会的题,一定要把样例写上去,骗分!
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 |
从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 开始
双指针的一般思路就是,先想出来暴力朴素算法,然后使用双指针优化
各位,蓝桥杯加油!!