2017年蓝桥杯真题B组部分思路

  1. 承压计算
    这一题比较巧妙地是每一层的数都乘了2^29,这样在往下算的时候不会有精度损失
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        long[][] arr = new long[30][30];
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 29; i++) {
            for (int j = 0; j <= i; j++) {
                long factor = sc.nextInt();
                arr[i][j] = factor<<29 ;
            }
        }
        for (int i = 0; i < 29; i++) {
            for (int j = 0; j <= i; j++) {
                long half = arr[i][j]>>1;
                arr[i+1][j] += half;
                arr[i+1][j+1] += half;
            }
        }
        Arrays.sort(arr[29]);
        System.out.println(Arrays.toString(arr[29]));
    }
}
  1. 魔方状态
    二阶魔方的所有状态都可以下图 通过三种方式转完

    太长了,不看了。
    蓝桥杯真题讲解视频代码原博客

  2. 第k位数
    这道题迷惑的是第k位是从左到右数还是从右到左数。
    题目明显是递归
    如果从右往左数,不需要递归就可以求出来。
    递归返回的数是求最末一位,如果不是最末一位,让它变成最末一位f(x/10,k)

 // 取x的第k位数字
    static int f(int x, int k){
        if(len(x)-k==0) return x%10;
        return ____;  //填空
    }
  1. 最长公共子串
    DP
    与公共子序列的思路类似

  2. 日期判断
    考虑个取值范围和闰年情况

  3. 包子凑数
    要用到欧几里得数论的内容,没学过,放弃。

  4. 分巧克力
    for循环暴力求解。
    从的到小遍历。遍历过程中优化。科以采用二分优化

  5. k倍区间
    DP
    以数列长度为len,创建一个二维数组DP[len][len],一个备忘录数组Memorandum[len][len]。备忘录书组表示对应区间是否是k倍区间。
    DP[i][j]表示数列区间[i,j]的和%k。
    先初始化第一行和最后一行,那么任意一个区间都可以用这两个的和与差表示出来。
    如果[i,k]&[j+1,k]||[s,i-1]&[s,j]都是k倍区间,那么[i,j]也是k倍区间
    如果只有一个是的话,那么就不是k倍区间,如果两个都不是,用DP里的余数,判断余数之和(差)是否是k倍区间。
    复杂度还是O(N^2)不知道会不会超时。
    emm。。。。。。。。。。。思路好像错了
    用一个一维数组保存和的状态就可以了。
    视频上讲的是前缀区间

你可能感兴趣的:(蓝桥杯基础题)