0
点赞
收藏
分享

微信扫一扫

【蓝桥杯】保姆级题解分析,带你冲刺国赛

和谐幸福的人生 2022-03-20 阅读 48

今日学习📃

🥇数字三角形(一题两解)

✨数字三角形

🥈等差数列(一题两坑)

✨等差数列

🥉包子凑数(dp压缩+打表)

✨包子凑数

🥇数字三角形

package Day_Day_work;

import java.util.Scanner;

/**
 * @author yx
 * @date 2022-03-20 11:42
 */
public class dp打表法 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n=scanner.nextInt();//山的高度
        int [][]arr=new int[n][n];
        for (int i = 0; i <n ; i++) {
            for (int j = 0; j <=i ; j++) {
                arr[i][j]=scanner.nextInt();
            }
        }
        int dp[][]=new int[n][n];
        dp[n-1]=arr[n-1];//初始化dp数组的最后一行
        for (int i = n-2; i >=0 ; i--) {
            for (int j = 0; j <=i ; j++) {
                dp[i][j]=arr[i][j]+Math.max(dp[i+1][j],dp[i+1][j+1]);//dp数组中的每一个位置都是当前更新的最大值
            }
        }
        System.out.println(dp[0][0]);
    }
}
package Day_Day_work;

import java.util.Scanner;

/**
 * @author yx
 * @date 2022-03-20 12:47
 */
public class 滚动数组解法 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n=scanner.nextInt();
        int [][]arr=new int[n][n];//存的是输入进来的数组
        int []dp=new int[n];//存的是当前最优的值
        for (int i = 0; i <n ; i++) {
            for (int j = 0; j <=i ; j++) {
                arr[i][j]=scanner.nextInt();
            }
        }
        dp=arr[n-1];
        for (int i = n-2; i >=0 ; i++) {
            for (int j = 0; j <=i ; j++) {
                dp[j]=arr[i][j]+Math.max(dp[j],dp[j+1]);//更新当前的最优值并覆盖原来的值
            }
        }
        System.out.println(dp[0]);
    }
}

🥈等差数列

package Day_Day_work;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author yx
 * @date 2022-03-12 19:22
 */
/*
需要考虑的情况
1、公差为0
2、公差为>=1
 */
public class 等差数列__gcd模板 {
    static  int min;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n=scanner.nextInt();
        int[]A=new int[n];
        int[]B=new int[n-1];
        for(int i=0;i<n;i++){
            A[i]=scanner.nextInt();
        }
        Arrays.sort(A);
        for (int i = 0; i < n-1; i++) {
            B[i]=A[i+1]-A[i];//求差值
        }
        min=gcd(B[0],B[1]);
        for (int i = 1; i < n-2; i++) {//求公差的最大公约数
            if (gcd(B[i], B[i + 1]) < min) {
                min = gcd(B[i], B[i + 1]);//如果公差为0,则直接返回0
            }
        }
        if(min==0){//公差为0的情况要放在for循环外面考虑
            System.out.println(n);
            return;
        }
        System.out.println((A[n-1]-A[0])/min+1);
    }

    static int gcd(int m,int n){//求最大公约数的模板
        return n!=0 ? gcd(n,m%n): m;
    }
}

🥉包子凑数

package Day_Day_work;

import java.util.Scanner;

/**
 * @author yx
 * @date 2022-03-18 23:52
 */
//类似于”买不到的数目“
public class 包子凑数__dp打表法 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n=scanner.nextInt();
        boolean arr[]=new boolean[10200];//根据裴蜀定理得最大不能表示的数字位(ab-a-b)
        int shuru[]=new int[n];
        int g=0;
        int answer=0;
        arr[0]=true;
        for (int i = 0; i < n; i++) {
            shuru[i]=scanner.nextInt();
            if (i==0)g=shuru[0];
            else {
                g=gcd(g,shuru[i]);
            }
            for (int j = 0; j < 10000; j++) {//打表法
                if(arr[j]){
                    /*
                    因为0<=j<10000,0<shuru[i]<=100,所以这个地方解释了为什么arr[10200],防止溢出
                    状态压缩成一维数组
                     */
                    arr[j+shuru[i]]=true;
                }
            }
        }
        if(g!=1){
            System.out.println("INF");
            return;
        }
        for (int i = 0; i < 10000; i++) {
            if(!arr[i])answer++;
        }
        System.out.println(answer);
    }
    static int gcd(int m,int n){
        return n!=0?gcd(n,m%n):m;
    }
}

🚀写在最后

博主给大家分享一个神奇的网站,上面有许多我们在算法竞赛中需要用到的数论知识💖oi-wikii

距离蓝桥杯正式省赛的时间越来越近了,你是否还在认真的备赛呢?

最后,希望我们都能够相信这么一句话:“只要路是对的,就不害怕遥远”

欢迎各位来交流讨论!

 

举报

相关推荐

0 条评论