第十四届蓝桥杯JavaB组省赛个人题解

虽然赛前没怎么做题,但这次省赛给我的感觉是比上一次简单,至少最后两个题都可以拿到一部分分了,上一次这两题都没有提交!
以下是个人的题解(回忆版):
试题 A: 阶乘求和
第十四届蓝桥杯JavaB组省赛个人题解_第1张图片
思路:别被这么大的数字吓到,其实100的阶乘以后都有10+个0了,再大了对答案也没有影响。
答案:420940313
代码:

package com.czl;
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long res = 0;
        int mod = (int)1e9;
        for(int i = 1; i <= 1000; i ++ ) {
            long cur = 1;
            for(int j = 1; j <= i; j ++ ) {
                cur *= j;
                cur %= mod;
            }
            res += cur;
            res %= mod;
        }
        System.out.println(res);
    }
}

试题 B: 幸运数字
第十四届蓝桥杯JavaB组省赛个人题解_第2张图片
思路:本题对于不熟悉进制的同学来说很难受,熟悉的话其实还是很简单的。
答案:215040
代码:

package com.czl;
import java.util.*;
public class Main {
    static int get(int x, int p) {
        int s = 0;
        while(x > 0) {
            s += x % p;
            x /= p;
        }
        return s;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int i = 1;
        int cnt = 0;
        while(cnt < 2023) {
            if(i % get(i, 2) == 0 && i % get(i, 8) == 0 && i % get(i, 10) == 0 && i % get(i, 16) == 0) {
                cnt ++ ;
                System.out.println(cnt + " " + i);
            }
            i ++ ;
        }
    }
}

试题 C: 数组分割
第十四届蓝桥杯JavaB组省赛个人题解_第3张图片
思路:先判读数组A中奇数的个数,如果不是偶数,直接输出0;

试题 D: 矩形总面积第十四届蓝桥杯JavaB组省赛个人题解_第4张图片
思路:暴力做的,感觉想拿满分会非常麻烦,暴力敲一遍就过去了,拿一半分得了。
代码:

package com.czl;
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = 1010;
        int s[][] = new int[N][N];
        for(int ii = 0; ii < 2; ii ++ ) {
            int x1 = sc.nextInt();
            int y1 = sc.nextInt();
            int x2 = sc.nextInt();
            int y2 = sc.nextInt();
            for(int i = x1 + 1; i <= x2; i ++ ) {
                for(int j = y1 + 1; j <= y2; j ++ ) {
                    s[i][j] = 1;
                }
            }
        }
        int res = 0;
        for(int i = 0; i < N; i ++ )
            for(int j = 0; j < N; j ++ ) {
                if(s[i][j] == 1) res ++ ;
            }
        System.out.println(res);
    }
}

试题 E: 蜗牛
第十四届蓝桥杯JavaB组省赛个人题解_第5张图片
思路:一眼DP,比较简单的线性DP。
代码:

package com.czl;
import java.util.*;
public class Main {
    static int N = 100010, INF = (int)1e9;
    static double f[][] = new double[N][2];
    static int lai[] = new int[N], song[] = new int[N], d[] = new int[N];

    static double f(int x) { //lai -> song
        if(lai[x] > song[x])
            return (lai[x] - song[x]) / 1.3;
        return (song[x] - lai[x]) / 0.7;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for(int i = 1; i <= n; i ++ ) {
            d[i] = sc.nextInt();
        }
        for(int i = 1; i <= n - 1; i ++ ) {
            song[i] = sc.nextInt();
            lai[i + 1] = sc.nextInt();
        }
        f[1][0] = d[1];
        f[1][1] = INF;
        for(int i = 2; i <= n; i ++ ) {
            f[i][0] = Math.min(f[i - 1][0], f[i - 1][1] + lai[i - 1] / 1.3) + d[i] - d[i - 1];
            f[i][1] = Math.min(f[i - 1][1] + f(i - 1), f[i - 1][0] + song[i - 1] / 0.7);
        }
        double res = Math.min(f[n][0], f[n][1] + lai[n] / 1.3);
        System.out.printf("%.2f", res);
    }
}

试题 F: 合并区域

试题 G: 买二赠一

试题 H: 合并石子

试题 I: 最大开支

试题 J: 魔法阵

你可能感兴趣的:(蓝桥杯,java)