小贴士:本文字数6千,粗读约需5分钟,精读约需30分钟
观点
今年的省赛和以前有点区别,更重视数学,算法,思想了,有点往ACM靠拢,相信这是一个趋势,以后的蓝桥杯将会更重视思维
提示:题目光看不练是不行的,建议打开IDE自己实现一波!!!
A. 字母
题目:字母A的ASCLL码值表示为65,那么字母L转换成ASCLL码值是多少
解题思路
方法一:直接从A(65)开始数到L(76)
方法二:java程序字符L强制转换成int
输出答案:76
代码如下(示例):
public class A字母 {
public static void main(String[] args) {
System.out.println((int)'A');
System.out.println((int)'L');
}
}
B. 卡片
解题思路
方法一:直接利用hashmap模拟即可
输出答案:3181
代码如下(示例):
import java.util.HashMap;
public class B卡片 {
/***
用map记录卡片数量,每个数字拆开来减1
*/
public static void main(String[] args) {
HashMap<Integer,Integer> map = new HashMap<>();
map.put(0,2021);
map.put(1,2021);
map.put(2,2021);
map.put(3,2021);
map.put(4,2021);
map.put(5,2021);
map.put(6,2021);
map.put(7,2021);
map.put(8,2021);
map.put(9,2021);
int i=1;
for (;; i++) {
boolean flag = false;
int num = i;
while (true){
int temp = num%10;
if (map.get(temp)<=0){
flag = true;
break;
}
map.put(temp,map.get(temp)-1);
num = num/10;
if (num==0){
break;
}
}
if (flag)break;;
}
System.out.println(i-1);
}
}
C. 直线
解题思路
方法一:两点确定一条直线,用直线确定方程的一般式子ax+by+c=0,求出所有的三元组(a,b,c),再去重
输出答案:40257
D. 货物摆放
解题思路
方法一:排列组合题,直接固定一个数,求另外两位数的组合即可
ps:
数据量大,数据类型用long
输出答案:2430
E. 路径
解题思路
方法一:用最小公倍数创建图的权值,再用floyd算法计算最短路径
输出答案:10266837
代码如下(示例):
public class E路径 {
public static void main(String[] args) {
int gragh[][] = new int[2050][2050];
int n = 2021;
for (int i = 1; i <= n; i++) {
gragh[i][i] = 0;
for (int j = i + 1; j <= i + 21; j++) {
gragh[i][j] = gragh[j][i] = lcm(i, j);
}
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (gragh[i][k] + gragh[k][j] < gragh[i][j]) {
gragh[i][j] = gragh[i][k] + gragh[k][j];
}
}
}
}
System.out.println(gragh[1][n]);
}
private static int lcm(int i, int j) {
return i / gcd(i, j) * j;
}
private static int gcd(int i, int j) {
return j == 0 ? i : gcd(j, i % j);
}
}
F. 时间显示
解题思路
方法一:模拟法,去掉天,取余算出小时,分钟,和秒
代码如下(示例):
import java.util.Scanner;
public class F时间显示 {
/***
模拟
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
n/=1000;
int res = (int) (n % (24*60*60)); //最后一天
int h = res/3600;
res %= 3600;
int m = res / 60;
res%=60;
System.out.println(h+":"+m+":"+res);//String.Format格式化一下就好
}
}
G. 砝码称重
解题思路
方法一:这题是01背包的变形;
H. 杨辉三角形
解题思路
方法一:当时模拟杨辉三角形再暴力匹配的,思路代码都比较简单,但是只能骗点分…
I. 双向排序
解题思路
方法一:完全是暴力骗分了,直接用sort排序的,有更好的做法可以评论留言…
J. 括号序列
解题思路
方法一:dfs暴力骗分,枚举所有可能的结果,再判断是否可以通过插入最少个数得到,是的话就count++;最后的count即是答案
代码如下(示例):
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class J括号序列 {
/***
dfs暴力骗分
()()()
这个set容器可以不需要,直接在dfs中计数,count设置为全局变量
*/
static Set<String> set = new HashSet<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
int left = 0;
int right = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
left++;
} else {
right++;
}
}
//int count = Math.max(left, right);
int count;//最多的括号数量
int sub;//插入的括号不能超过sub个,也就是不一样的括号数量
if (left > right) {
count = left;
sub = left - right;
} else {
count = right;
sub = right - left;
}
String temp = "";
for (int i = 0; i < count; i++) {
temp += "()";
}
dfs(temp);
System.out.println(set);
int resCount = 0;
for (String s1 : set) {
int i = 0;
int j = 0;
boolean isMatch = true;
while (i < s.length() && j < s1.length()) {
int tempCount = sub;
if (s.charAt(i) == s1.charAt(j)) {
i++;
j++;
} else {
j++;
tempCount--;
}
if (tempCount < 0) {
isMatch = false;
break;
}
}
if (isMatch) {
resCount++;
}
}
System.out.println(resCount);
}
private static void dfs(String temp) {
set.add(temp);
for (int i = 0; i < temp.length() - 1; i++) {
if (temp.charAt(i) == ')' && temp.charAt(i + 1) == '(') {
String temps = temp.substring(0, i) + "()" + temp.substring(i + 2, temp.length());
dfs(temps);
}
}
}
}
总结
要想更好的提升算法能力,归根结底还是要多刷题,分类刷题
如果大家有更好的思路和解法,希望能评论区分享一波