写在前面
时光荏苒,岁月如梭,恍惚间蓝桥杯开赛的日子近在咫尺。。为什么这么官方。。。咳咳,明天就开赛了,俗话说得好临阵磨枪,不快也光!秉承着华夏民族优良专统,于是来刷一遍去年的真题,从去年的难度整体上来看我要是去年去比赛的话省三应该不成问题,但是不知道今年会不会变难,他要是上来就是高级数学公式,找各种规律,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~
生如蝼蚁,当有鸿鹄之志。命如纸薄,却有不屈之心。乾坤未定,你我皆是黑马。有朝一日,必将飞黄腾达!!