第十一届蓝桥杯省赛Java大学B组(第一场)

试题 A:解密

1
YeRikGSunlRzgDlvRwYkXkrGWWhXaA

试题B :纪念日

1
2
3
4
5
6
7
8
9
10
class Solution {
public void solve() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD HH:MM:SS"); //格式大小写任意
Date begin = (Date)sdf.parse("1921-7-23 12:00:00");
Date end = (Date)sdf.parse("2020-7-1 12:00:00");
//getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
long ans = end.getTime() - begin.getTime();
System.out.println(ans / 60000); //60000毫秒 = 1分钟
}
}

试题C:合并检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public void solve() { //从1枚举到10000
int sum = 10000;
double ans = 0x3f3f3f3f;
double num;
int res = 0x3f3f3f3f;
for(int i = 1;i <= 10000;i++){
if(sum % i == 0) //k值为偶数
num = sum / i + sum * 0.01 * i;
else //k值为奇数
num = sum / i + sum * 0.01 * i + 1;
if(num < ans){ //更新最小总试剂盒数ans和最优单组个数res
ans = num;
res = i;
}
// System.out.println("ans = " + ans);
// System.out.println("res = " + res);
}
System.out.println(res);
}
}

试题D:分配口罩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution {

int[] arr = new int[]{9090400, 8499400, 5926800,
8547000, 4958200, 4422600, 5751200, 4175600, 6309600,
5865200, 6604400, 4635000, 10663400, 8087200, 4554000};
int ans = 0x3f3f3f3f; //INF

public int dfs(int x,int y,int sub){
//System.out.println("x " + x + " " + y + " " + sub);
if(x + y == 15){ //当前已经考虑过的批次等于总批次
ans = Math.min(ans,Math.abs(sub)); //更新最小差值
//System.out.println("ans = " + ans);
return 0; //返回上一种方案并继续递归
}
//差值sub默认按第一所医院减去第二所医院
int now = sub;
dfs(x + 1,y,now + arr[x + y]); //当前批次考虑给第一所医院,差值变大
dfs(x,y + 1,now - arr[x + y]); //当前批次考虑给第二所医院,差值变小
return 0; //返回上一种方案并继续递归
}

public void dfs2(int u,int s1,int s2){
if(u == arr.length){ //当前已分配的批次等于总批次
ans = Math.min(ans,Math.abs(s1 - s2)); ////更新最小差值
return;
}
dfs2(u + 1,s1 + arr[u],s2); //当前考虑的批次分配给第一所医院
dfs2(u + 1,s1,s2 + arr[u]); //当前考虑的批次分配给第二所医院
}

public void solve(){
//System.out.println(dfs(0,0,0));
dfs(0,0,0); //当前第一所医院有0批,第二所医院有0批,两者口罩数量差为0
//dfs2(0,0,0); //当前已分配0批口罩,第一所医院有0个口罩,第二所医院有0个口罩
System.out.println(ans);
}
}

试题E:斐波那契数列最大公约数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {

final BigInteger INF = new BigInteger("-1"); //不要设置为正数,因为很有可能刚好有一项会相等
BigInteger[] vis = new BigInteger[3000]; //斐波那契数列记忆数组

public void gcd(BigInteger a,BigInteger b){ //计算最大公约数
if(b.equals(BigInteger.ZERO))
System.out.println("res = " + a);
else
gcd(b,a.mod(b));
}

public BigInteger fib(int n){ //计算斐波那契数列
// System.out.println(n);
if(vis[n] != INF) //已经计算过的数列值直接从数组取
return vis[n];
if(n == 1 || n == 2) //fib(1) = fib(2) = 1
return BigInteger.ONE;
else
return vis[n] = fib(n - 1).add(fib(n - 2)); //递归并存入数组
}

public void solve() {
Arrays.fill(vis,INF);
BigInteger a = fib(2020);
BigInteger b = fib(520);
System.out.println("a = " + a.toString());
System.out.println("b = " + b.toString());
gcd(a,b);
}
}

试题F:分类计数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {

public void solve() {
Scanner sc = new Scanner(System.in);
int digit = 0;
int lcase = 0;
int ucase = 0;
char[] arr = sc.nextLine().toCharArray(); //不能用next(),否则遇到空格就无法读取后面的东西
for(int i = 0;i < arr.length;i++){
if(Character.isDigit(arr[i])) //数字
digit++;
else if(Character.isUpperCase(arr[i])) //大写字母
ucase++;
else if(Character.isLowerCase(arr[i])) //小写字母
lcase++;
}
System.out.println(ucase + "\n" + lcase + "\n" + digit);
}
}

试题G:八次求和