写在前面

时光荏苒,岁月如梭,恍惚间蓝桥杯开赛的日子近在咫尺。。为什么这么官方。。。咳咳,明天就开赛了,俗话说得好临阵磨枪,不快也光!秉承着华夏民族优良专统,于是来刷一遍去年的真题,从去年的难度整体上来看我要是去年去比赛的话省三应该不成问题,但是不知道今年会不会变难,他要是上来就是高级数学公式,找各种规律,DP,贪心,背包那我干脆弃赛得了,高级算法不适合我,太难了~~,此篇我也只是解决了前八道题目,最后两道题目与我目前段位实在是不匹配,所以以后有缘再续 ~~

第一题:解密 (简单)

这题水题,直接看就可以出结果,不用编程。

public class Main {

    public static void main(String[] args) {
        // EaFnjISplhFviDhwFbEjRjfIBBkRyY
        // YeRikGSunlRzgDlvRwYkXkrGWWhXaA
        // YeRikGSunlRzgDlvRwYkXkrGWWhXaA
        System.out.println("YeRikGSunlRzgDlvRwYkXkrGWWhXaA");
    }
    
}

第二题:纪念日 (还好)

对于这种类型的题目都是操作时间的,所以我们用Java的APILocalDate来做,这里面有丰富的方法,所以我们可以很快的得出答案。

import java.time.LocalDate;

public class Main {

    public static void main(String[] args) {
        //52038720
        //52,038,720
        //两个日期间相差的天数  这里不包含起始日期,如果想要结果包含起始日期,则需要再结果上+1
        LocalDate d1 = LocalDate.of(2020, 7, 1);
        LocalDate d2 = LocalDate.of(1921, 7, 23);
        System.out.println((d1.toEpochDay() - d2.toEpochDay()) * 1440);
        //System.out.println("52038720");
    }
    
}

第三题:合并检测 (中等)

思维题,但是我不看答案也确实是想不到,题目描述的有点模糊,所以这题有点东西

答案是:10

放个题解吧:

第四题:分配口罩 (中等)

这题我乍一看不会,再乍一看,还是不会,但是我知道这题是用搜索来做,网上甚至有人用DP,背包问题来做。。。

  • 本题是一个典型的递归问题(多路径问题)
  • dfs函数的三个参数分别为 k、sum1、sum2
    k代表正在处理数字的下标
    sum1为1号医院的口罩数量
    sum2位2号医院的口罩数量
  • 当k=15时,说明所有口罩全部分配完成,此时要确定最小值和当前两个医院数量的差值
  • 函数体中处理的是不同路径
    第一个是给1号医院分配
    第二个是给2号医院分配
  • 经过多次递归回溯,会计算出所有分配情况的最小值
public class Main {
	public static long res=Long.MAX_VALUE;
	public static long num[]={9090400, 8499400, 5926800, 8547000, 4958200,
			   				  4422600, 5751200, 4175600, 6309600, 5865200, 
			   				  6604400, 4635000, 10663400, 8087200, 4554000
							}; 
    public static void main(String[] args){
    	dfs(0, 0, 0);
    	System.out.println(res);
	}
    public static void dfs(int k,long sum1,long sum2 ) {
    	if(k==15) {
    		res=res<Math.abs(sum1-sum2)?res:Math.abs(sum1-sum2);
    		return;
    	}
    	dfs(k+1, sum1+num[k], sum2);
    	dfs(k+1, sum1, sum2+num[k]);
    }
}//2400

第五题:斐波那契数列最大公约数 (中等)

这道题目就是考察大数操作,然后求解一个最大公约数就可以了,难就难在大数操作

//方法一:这个可以做,逻辑上是对的,但是肯定超时,我的idea跑了五分钟了,还是没结果,,,所以果断弃之,只是提供一个思路参考

import java.math.BigInteger;

/**
 * 斐波那契数列最大公约数 2020项和520项的最大公约数
 */
public class Main {

    public static void main(String[] args) {
        BigInteger b1 = fun(520);
        BigInteger b2 = fun(2020);
        BigInteger b = b1.gcd(b2);
        System.out.println(b);
    }

    // 求斐波那契数列第n项的值
    public static BigInteger fun(int n) {
        if (n == 1) {
            return BigInteger.ONE;
        }
        if (n == 0) {
            return BigInteger.ZERO;
        }
        return fun(n - 1).add(fun(n - 2));

    }
}

//方法二:用数组来存取会很快

import java.math.BigInteger;

/**
 * 斐波那契数列最大公约数 2020项和520项的最大公约数
 */
public class Main {

    public static void main(String[] args) {
        BigInteger a = BigInteger.ONE;
        BigInteger b = BigInteger.ONE;

        BigInteger[] arr = new BigInteger[2030];
        arr[1] = a;
        arr[2] = b;

        for (int i = 3; i < arr.length; i++) {
            arr[i] = arr[i - 1].add(arr[i - 2]);
        }
        System.out.println(arr[520].gcd(arr[2020]));
    }

}
//6765

第六题:分类计数 (简单)

这题。。。。调用API来做还是很简单的,会用Character.isDigit(),Character.isLOWerCase(),Character.isUpperCase()就可以了。

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String s = input.next();
        int c1 = 0, c2 = 0, c3 = 0;
        for (int i = 0; i < s.length(); i++) {
            // System.out.println(s.charAt(i));
            if (Character.isDigit(s.charAt(i))) {
                c1++;
            } else if (Character.isLowerCase(s.charAt(i))) {
                c2++;
            } else if (Character.isUpperCase(s.charAt(i))) {
                c3++;
            }
        }

        System.out.println(c3);
        System.out.println(c2);
        System.out.println(c1);

    }
}

第七题:八次求和 (简单)

这道题目也是比较简单的,模拟一下顺着思路做就可以了,也是考察大数操作,然后取模。

//网友答案
import java.math.BigInteger;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        // 1000000
        BigInteger sum = BigInteger.ZERO;
        for (int i = 1; i <= n; i++) {
            BigInteger bi = BigInteger.ONE;
            sum = sum.add(new BigInteger(i + "").pow(8));

        }
        System.out.println(sum.mod(new BigInteger("123456789")));

    }
}

//自己想的
import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        BigInteger sum = BigInteger.ZERO;

        for (int i = 1; i <= n; i++) {
            String s = Integer.toString(i);
            BigInteger b = new BigInteger(s);
            BigInteger m = b.pow(8);
            sum = sum.add(m);// 这里需要注意一点,因为BIgInteger是不可变的,所以我们必须将他赋给一个变量
            // System.out.println(sum);
        }
        System.out.println(sum.mod(new BigInteger("123456789")));
    }
}

第八题:字符串编码 (困难)

emmm,整体来看这道题目还是比较麻烦的,最主要的是我们如何判断得到的就是最大的字母呢,所以我们先把字符串化成一个字符串数组,用数组来操作会比直接在字符串上操作要方便的多,然后我们遍历字符串,然后将两个字符数组结合看是否小于27,如果小于的话就输出整个的,如果大于的话就输出第一个字符。依次类推。

import java.util.HashMap;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        char[] c = str.toCharArray();
        int i;
        for (i = 0; i < str.length() - 1; i++) {
            int a = c[i] - '0';
            int b = c[i + 1] - '0';
            int ans = a * 10 + b;
            if (ans < 27) {
                char ch = (char) (ans + 64);
                System.out.print(ch);
                i++;
            } else {
                char ch = (char) (a + 64);
                System.out.print(ch);
            }
        }
        if (i < str.length()) {
            char ch = (char) (c[i] - '0' + 64);
            System.out.print(ch);
        }
    }
}

第九题:BST插入节点问题 (究极,不会)

题目都看不懂,盲猜考察树节点的插入,but,不会。。。骗骗分就溜了。。。

第十题:网络分析 (究极,不会)

这个题也看不懂。。。哈哈哈

骗骗分也溜了。。。

注:最后两道题有点难,等我日后功力提升了再来干掉他们!!

写在最后

这一年的题相比前几年的题难度确实是有所下降,也不知道是心理原因,还是看过答案的原因,总感觉比第8,9,10届简单一点,前几届我看过答案之后都没这届这么透彻,这一年基本就是大数操作比较多,我记得有一年考的比较多的是全排列,我的妈呀,那可真费劲,也辛亏有Java的APIBiginteger要不然也确实是不好操作。不知道明天的题会不会比这一年的题目难,如果考察算法都是我不会的,那就gg了,既来之则安之吧。总而言之,可能我努力的还是不够,但实在是刷题刷不动了,总有人说一个人的潜力是无限的,但是激发潜力的前提总归有一个触刺激阶段吧,或许明天比赛失利了就是对我最好的刺激吧,这届蓝桥杯可能是我参加的最后一次算法的比赛了,因为就要工作了,需要努力扩展技术栈和准备面试了,算法比赛就没有时间了参加了。不管怎样,一直努力就是了,贴一段我最喜欢的话吧,也算是给我明天的比赛打打气了。hh~

生如蝼蚁,当有鸿鹄之志。命如纸薄,却有不屈之心。乾坤未定,你我皆是黑马。有朝一日,必将飞黄腾达!!