当前位置: 首页 > news >正文

蓝桥杯高校新生编程赛第二场题解——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.明确目标有三只鸡,羽毛数分别为xyz。可执行两种操作,要求计算让三只鸡羽毛数相同所需的最少操作次数。看起来又像个数学题。

2.继续分析:要让三只鸡羽毛数最终相同,设最终每只鸡的羽毛数为k,需满足以下两个逻辑:

  • k至少是xyz中的最大值;
  • 总羽毛数需满足 3k = 初始总羽毛数 + 2×操作次数(因为每次操作总羽毛数增加 2)。

3.解题步骤:因此解题步骤便清晰了,首先计算初始总羽毛数sum = x + y + z;然后从max(x,y,z)开始,遍历循环尝试k,找到满足3k ≥ sum3k - sum为正偶数的最小k。

4.输出操作:最后输出操作次数为 (3k - sum) / 2

http://www.dtcms.com/a/549599.html

相关文章:

  • 深入理解XXE外部实体注入漏洞:原理、利用与防护
  • 用 CTE 重构嵌套子查询:让复杂报表 SQL 可读性提升 80%
  • 做阿里云网站的公司吗南昌做网站后台投票
  • Docker 容器命令深度解析:从docker run到docker ps的精通之路
  • 开源自动驾驶平台全景:超越Autoware和Apollo
  • 深入JVM:让Java性能起飞的核心原理与优化策略
  • RFID 技术赋能汽车制造:发动机气缸缸体生产线智能化升级案例
  • Java Excel页面设置配置指南
  • 网站集约化建设做法ecommercial+wordpress
  • C#:调试附加到进程
  • Redis哈希槽
  • SAP PP BOM查询报表分享
  • 国内 扁平化 网站坂田杨美企业网站建设
  • 抖音火花任务自动化脚本
  • 从入门到实践:Linux 基础学习(xshell)
  • 《URP管线主导的角色材质、阴影与显存动态适配优化方案》
  • TensorFlow深度学习实战——自定义图数据集
  • Flutter 3.29.0 使用RepaintBoundary或者ScreenshotController出现导出图片渲染上下颠倒问题
  • Flutter---个人信息(4)---实现修改生日日期
  • 不止于加热:管式炉在材料科学与新能源研发中的关键作用
  • 深圳网站建设方案优化深圳发布广告的平台有哪些
  • Go语言中json.RawMessage
  • Pytorch常用函数学习摘录
  • 个人什么取消网站备案铭万做的网站怎么样
  • 2025-10-30 ZYZOJ Star(斯达)模拟赛 hetao1733837的record
  • 百胜中台×OceanBase:打造品牌零售降本增效的数字核心引擎,热门服饰、美妆客户已实践
  • 深度学习调试工具链:从PyTorch Profiler到TensorBoard可视化
  • 不可变借用的规则与限制: 从只读语义到零拷贝架构的 5 000 字深潜
  • 专题三 之 【二分查找】
  • C++进阶: override和final说明符-----继承2中重写的确认官和刹车(制动器)