下文为蓝桥杯年2021年Java大学B组省赛真题
01-直线
枚举 + 平面几何,难度中等,坑点很多,重点理解直线表示的斜截式
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
/**
* https://www.lanqiao.cn/courses/5493/learning/?id=252014
* 代码没调通
*/
public class T01Line {
// 辗转相除法求最大公约数
static int gcd(int a, int b) {
// (b, a%b) => a,b的大小无所谓
return gcd(b, a % b);
}
public static void main(String[] args) {
// 存放点(高两位存放x,低两位存放y) || 1256 => x = 12; y = 56
HashSet<Integer> set = new HashSet<>();
int X = 19;
int Y = 20;
for (int i = 0; i < X; i++) {
for (int j = 0; j < Y; j++) {
set.add(i * 100 + j);
}
}
// 存放答案的集合(使用set去重)
HashSet<String> ans = new HashSet<>();
// 因为set没有get方法
List<Integer> arr = new ArrayList<>(set);
int len = arr.size();
// 遍历每一个点
for (int i = 0; i < len; i++) {
// 获取一个顶点a
int a = arr.get(i);
// 遍历除a表示的点之外的点
for (int j = i + 1; j < len; j++) {
// 获取另一个顶点b
int b = arr.get(j);
int y1 = a / 100, y2 = b / 100, x1 = a % 100, x2 = b % 100;
// 斜截式: y = (y2-y1)/(x2-x1) + b
// up = y2 - y1; down = x2 - x1;
// 斜率: k = (y2-y1)/(x2-x1) = up/down
// 参数: b = {y1*(x2-x1)-(y2-y1))*x1}/down = (y1*down-up*x1)/down
int up = y2 - y1;
int down = x2 - x1;
if (down == 0){
// down = 0代表着k=0,所以斜线为:y1 = 0 + x1
ans.add("x = " + x1);
continue;
}
// 求up, down的最大公约数
int C1 = gcd(up, down);
String K = (up / C1) + " " + (down / C1);
int kb = y1 * down - up *x1;
// 求(y1*down-up*x1)、down的最大公约数
int C2 = gcd(up, down);
String B = (kb / C2) + " " + (down / C2);
ans.add(K + " " + B);
}
}
System.out.println(ans.size());
}
}
02-ASCII
送分题,有一点计算机字符基础就能算出来
/**
* https://www.lanqiao.cn/courses/5493/learning/?id=252011
*/
public class T02ASC {
public static void main(String[] args) {
System.out.println(65 + ('L'-'A'));
}
}
03-卡片
暴力穷举,简单题
import java.util.HashMap;
import java.util.Scanner;
/**
* https://www.lanqiao.cn/courses/5493/learning/?id=252013
*/
public class T03Card {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i <= 9; i++) {
map.put( i, 2021);
}
// 终止标志:true 终止
boolean flag = false;
// 上限 20210
for (int i = 0; i < 20210; i++) {
String s = String.valueOf(i);
for (int j = 0; j < s.length(); j++) {
int n = s.charAt(j) - '0';
int cnt = map.get(n);
if(cnt > 0){
map.put(n, cnt - 1);
}else{
System.out.println(i);
flag = true;
break;
}
}
if (flag){
break;
}
}
scan.close();
}
}