蓝桥杯高校新生编程赛第二场题解——Java
01. 季度归类【新生编程赛】

完整解题代码:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);//在此输入您的代码...int N=scan.nextInt();if (N==1 || N==2 || N==3){System.out.println("Q1");}else if (N==4 || N==5 || N==6){System.out.println("Q2");}else if (N==7 || N==8 || N==9){System.out.println("Q3");}else if (N==10 || N==11 || N==12){System.out.println("Q4");}else{System.out.println("??");}scan.close();}
}
解题思路:
超级无敌简单题,使用判断语句暴力求解即可
02. 新生棋局【新生编程赛】

完整解题代码:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);//在此输入您的代码...int n=scan.nextInt();System.out.println("YES");scan.close();}
}解题思路:
1.明确目标:一开始看到题目,以为需要非常复杂且繁琐的代码量,奇偶性的约束条件,看起来十分唬人,没有目标,根本无法下手。
2.仔细分析:我们可以把N×N的棋盘想象成 “国际象棋棋盘”,用黑白两色交替染色(相邻格子颜色不同)。此时棋盘被分为两个集合:
- 黑色格子集合(记为集合 A)
- 白色格子集合(记为集合 B)
当N是奇数时,N²也是奇数,因此两个集合的格子数量会相差 1:
- 集合 A 的格子数:(N²+1)/2
- 集合 B 的格子数:(N²-1)/2
举个例子:N=3(3×3 棋盘,共 9 格)
- 集合 A(比如黑色)有 5 格,集合 B(白色)有 4 格,满足 5=(9+1)/2,4=(9−1)/2。
3.进一步验证:1 到N²中奇偶数字的数量,在1,2,…,N²中:
- 奇数的数量是 ⌈N²/2⌉(向上取整)。当N²是奇数时,⌈N²/2⌉=(N²+1)/2。
- 偶数的数量是 ⌊N²/2⌋(向下取整)。当N²是奇数时,⌊N²/2⌋=(N²−1)/2。
同样以N=3为例(数字 1~9):
- 奇数有 1、3、5、7、9,共 5 个,即 (9+1)/2=5。
- 偶数有 2、4、6、8,共 4 个,即 (9−1)/2=4。
此时,棋盘的两个集合(A 和 B)的大小,恰好等于1 到N2中奇偶数字的数量:
- 集合 A 的格子数 (N²+1)/2 = 奇数的数量。
- 集合 B 的格子数 (N²−1)/2 = 偶数的数量。
因此,我们可以直接将所有奇数填入集合 A 的格子,所有偶数填入集合 B 的格子。由于集合 A 和集合 B 的格子是 “相邻必不同色”(即相邻格子奇偶性不同),所以这种填法完全满足题目中 “相邻格子奇偶性不同” 的约束。
4.输出:因此直接输出“YES”即可。
03.借书卡编号【新生编程赛】
完整解题代码:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);//在此输入您的代码...int N=scan.nextInt();String str=String.format("%06d",N);int num1=Integer.parseInt(str);int d1=num1%10;num1=num1/10;int d2=num1%10;num1=num1/10;int d3=num1%10;num1=num1/10;int d4=num1%10;num1=num1/10;int d5=num1%10;num1=num1/10;int d6=num1%10;if(d1+d2+d3==d4+d5+d6){System.out.println("YES");}else{System.out.println("NO");}scan.close();}
}解题思路:
1.明确目标:题目无非要求将输入的一个整数(如不足 6 位,在前面补0补成6位),然后判断该 6 位数字的前三位数字之和与后三位数字之和是否相等。很显然需要做两步事情。
2.补全6位:因此我想到用String.format("%06d", N)将该整数格式化为 6 位字符串。
3.提取数字:这一步就与之前的分离数位做法一致,通过num % 10获取各个位数上的数字。
4.判断输出:对提取出的前三位和后三位使用判断语句,并输出相应解答。
涉及知识点:
1.String.format() 
基础概念
String.format()是 Java 中 String 类的一个静态方法,用于格式化字符串的强大方法,类似于 C 语言的 printf()。它允许通过占位符动态生成格式化的字符串。它的基本语法如下:
public static String format(String format, Object... args)
format:这是一个格式字符串,它包含普通字符和格式说明符。普通字符会按原样输出,而格式说明符用于指定如何格式化后面的参数。
args:这是一个可变参数列表,包含要插入到格式字符串中的值。
使用方法
以下是一个简单的示例,展示了如何使用 String.format 格式化字符串:
public class StringFormatExample {public static void main(String[] args) {String name = "John";int age = 30;String message = String.format("My name is %s and I am %d years old.", name, age);System.out.println(message);}
在这个示例中,
%s是字符串格式说明符,用于格式化name变量;%d是整数格式说明符,用于格式化age变量。
指定参数索引
可以使用 argument_index$ 来指定要格式化的参数的索引:
public class StringFormatIndexExample {public static void main(String[] args) {String name = "John";int age = 30;String message = String.format("My name is %2$s and I am %1$d years old.", age, name);System.out.println(message);}
}
在这个示例中,
%2$s表示使用第二个参数(即name)进行字符串格式化,%1$d表示使用第一个参数(即age)进行整数格式化。
使用标志和宽度
可以使用标志和宽度来控制格式化的输出:
public class StringFormatFlagsExample {public static void main(String[] args) {int number = 123;String formatted = String.format("%08d", number);System.out.println(formatted);}
}
在这个示例中,
%08d表示使用零填充,总宽度为 8 位的整数格式化。在本题中,我们即使用了该方法,String str=String.format("%06d",N);表示使用0填充,总宽度为6。
常见实践
1.格式化日期和时间
可以使用 String.format 来格式化日期和时间:
import java.util.Date;public class StringFormatDateExample {public static void main(String[] args) {Date now = new Date();String formattedDate = String.format("Today is %tF", now);System.out.println(formattedDate);}
}
在这个示例中,
%tF是日期格式说明符,用于以YYYY-MM-DD的格式输出日期。
2.格式化浮点数
可以使用 String.format 来格式化浮点数:
public class StringFormatFloatExample {public static void main(String[] args) {double pi = Math.PI;String formattedPi = String.format("Pi is approximately %.2f", pi);System.out.println(formattedPi);}
}
在这个示例中,
%.2f表示保留两位小数的浮点数格式化。
最佳实践
1.提高代码可读性
使用 String.format 可以提高代码的可读性,尤其是在需要拼接多个变量的情况下。例如:
public class StringFormatReadabilityExample {public static void main(String[] args) {String city = "New York";int population = 8500000;String info = String.format("The city of %s has a population of %d.", city, population);System.out.println(info);}
}
2.避免字符串拼接
在需要拼接大量字符串时,使用 String.format 可以避免频繁的字符串拼接操作,提高性能。例如:
public class StringFormatPerformanceExample {public static void main(String[] args) {String[] words = {"Hello", "World", "!"};String message = String.format("%s %s %s", words[0], words[1], words[2]);System.out.println(message);}
}
04.横竖切蛋糕【新生编程赛】
 
完整解题代码:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);//在此输入您的代码...int N=scan.nextInt();int x=N/2;int y=N-x;int sum=(x+1)*(y+1);System.out.println(sum);scan.close();}
}
解题思路:
1.明确目标:根据可切的🔪数,判断切出的最大蛋糕数,第一反应又可以把他看作一个数学分析的题目。
2.仔细分析:易得用数学“和定积最大” 的规律(均值不等式证明):即当两个数的和固定时,它们的差越小,乘积越大。即横竖切最接近时,切出的蛋糕数量最多。
 
(高中回忆杀。。。。。。。)
3.拆分输出:将N分为差最小的两数,相乘即得最大块数。
05.贴上羽毛【新生编程赛】

完整代码解析:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);//在此输入您的代码...int x = scan.nextInt();int y = scan.nextInt();int z = scan.nextInt();int sum = x + y + z; int max = Math.max(x, Math.max(y, z));int k = max;while (true) {int diff = 3 * k - sum; if (diff >= 0 && diff % 2 == 0) {System.out.println(diff / 2); break;}k++; }scan.close();}
}解题思路:
1.明确目标:有三只鸡,羽毛数分别为x、y、z。可执行两种操作,要求计算让三只鸡羽毛数相同所需的最少操作次数。看起来又像个数学题。
2.继续分析:要让三只鸡羽毛数最终相同,设最终每只鸡的羽毛数为k,需满足以下两个逻辑:
- k至少是- x、- y、- z中的最大值;
- 总羽毛数需满足 3k = 初始总羽毛数 + 2×操作次数(因为每次操作总羽毛数增加 2)。
3.解题步骤:因此解题步骤便清晰了,首先计算初始总羽毛数sum = x + y + z;然后从max(x,y,z)开始,遍历循环尝试k,找到满足3k ≥ sum且3k - sum为正偶数的最小k。
4.输出操作:最后输出操作次数为 (3k - sum) / 2。
