蓝桥杯高校新生编程赛第二场题解——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

相关推荐
陈果然DeepVersion8 小时前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(四)
java·spring boot·微服务·kafka·面试题·rag·ai智能客服
blammmp8 小时前
算法专题十七:穷举vs暴搜vs深搜vs回溯vs剪枝
算法·机器学习·剪枝
好学且牛逼的马8 小时前
【JavaWeb|day16 Web前端基础】
java
haofafa8 小时前
高精度加减法
java·数据结构·算法
huihuihuanhuan.xin8 小时前
后端八股之消息队列
java·rabbitmq
weixin_307779138 小时前
利用特征值和特征函数求解积分方程
算法
TT哇8 小时前
【BFS 解决FloodFill 算法】4. 被围绕的区域(medium)
算法·宽度优先
渡我白衣8 小时前
C++世界的混沌边界:undefined_behavior
java·开发语言·c++·人工智能·深度学习·语言模型
88Ra9 小时前
Spring Boot 3.3新特性全解析
java·spring boot·后端