蓝桥杯的一些要点
[1] 全排列
1、使用递归函数f(int[] a, int k)k为数组下标,从0开始
2、递归出口条件为k==a.length
3、for循环开始,i与k换值,调用f(a,k+1),再回溯,即i与k再次换值
[2] 并查集
1、父节点集合,最开始的父节点都是自己 head[i]=i,i为自己的标号,head[i]为父节点
2、找父节点,当找到父节点为自己时就是找到了(head[i]=i)
3、合并节点,若父节点不一样,就把一个节点的根节点设为另一个节点的根节点的子节点。
4、关系的存储,两个两个存,直接通过head存
5、树的数量,即为根节点的数量
[3] 任意取球 n个球中取m个,不放回
1、看作n个球中有一个特殊球x,取法的划分即为包不包含x
2、递归完成,递归条件为n<m,n==m,m==0,(m==0的情况也应返回1)
3、递归f(n-1,m)+f(n-1,m-1)
对应数学公式,即为n个中取m个组合等于n-1个中取m-1个加上n-1中取m个
[4] 精确小数,任意精度
1、使用BigDecimal和MathContext类,如1/6,保留12位小数
BigDecimal a = BigDecimal.valueOf(1).divide(BigDecimal.valueOf(6), new MathContext(12));
[5] 求最大公约数
1、使用辗转相除法
注意递归调用的m,n值
public static int gcd(int m,int n){
if (n == 0) {
return m;
} else {
return gcd(n, m % n);
}
}
2、最小公倍数等于两个数之积除以最大公约数 a*b/gcd(m,n);
[6] 凑数问题
1、最大公约数不为1,则有无数个数不能被凑出来
2、有限个时,设一个大数组,一个一个基数讨论,能被凑出的则当前数设为1,和数组中原先为1的下标值加上基数后的值对应的数也设为1.
3、大数组中为0的数的下标,即为不能凑出来的数。
int[] b = new int[10000];
b[0]=1;//0是一定可以凑出的
for (int j2 = 0; j2 < a.length; j2++) {
for (int j = 0; j+a[j2]< b.length; j++) {
if(b[j]==1){//因为有这个判断,所以j++是没问题的
b[j+a[j2]]=1;
}
}
}
[7] 零散的要点
1.求隔多少天的日期,用execl求最快
2.去重时,重数一定要数好,一种情况下的所有状态,不能减1!!!
3.太多值求解的,使用控制台复制输入最快
4 . 注意浮点数,化成整数再做运算
5.要记得考虑为0的情况和不为0的情况,还有可能全为负数的情况等等
6.可以暴力枚举直接暴力枚举,不要怕麻烦,计算的是计算机,不是自己,没有范围的,直接给个大范围