蓝桥杯的一些要点

                        蓝桥杯的一些要点


[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.可以暴力枚举直接暴力枚举,不要怕麻烦,计算的是计算机,不是自己,没有范围的,直接给个大范围

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值