【十三届蓝桥杯省赛解析javaC组】

本文介绍了多个编程竞赛的题目及其解题思路,涵盖了字母排序、特殊时间计算、纸张尺寸计算、序列求和、矩形拼接、选数异或、最大公约数、青蛙过河和因数平方和等问题。通过实例解析,展示了如何运用不同算法解决问题,并提供了Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A. 字母排序

题目描述

在这里插入图片描述

解题思路

A题相对比较简单,这题有两种解法
第一种是可以利用记事本把文本复制,然后自己手动排序
第二种是写代码:具体思路是定义一个字符串用来储存问文本,然后把文本转成字符型数组,利用Arrays.sort对字符型数组进行排序,最终实现字符的排序

代码示例

import java.util.Arrays;
import java.util.Scanner;

public class A {
   
    static String str;
    static char[] chars;

    public static void main(String[] args) {
   
        Scanner scan = new Scanner(System.in);
        str = scan.next();
        chars = new char[str.length()];
        trans();
        Arrays.sort(chars);
        print();
    }

    private static void trans() {
   
        for (int i = 0; i < str.length(); i++) {
   
            chars[i]=str.charAt(i);
        }
    }
    private static void print(){
   
        for (char a:chars) {
   
            System.out.print(a);
        }
    }
}

B. 特殊时间

题目描述

2022年2月22日22:2022:20 是一个很有意义的时间, 年份为2022,由3个2和1个0
组成, 如果将月和日写成4位, 为0222,也是由3个2和1个0组成, 如果将时间中的
时和分写成4位, 还是由 3个2 和1个0组成。

小蓝对这样的时间很感兴趣, 他还找到了其它类似的例子, 比如111年10月11日
01:11,220201:11,2202 年2月22日22:0222:02等等。

请问, 总共有多少个时间是这种年份写成4位月日写成4 位时间写成4位后由3个
一种数字和 1 个另一种数字组成。注意1111年11月11日11: 1111:11不算,因为
它里面没有两种数字

解题思路

因为时间里面只有两个不同的数字,我们可以通过对两个数字的遍历去组成不同的四位数,然后通过check_month和check_time函数去判别组成的四位数是否合格(是否符合时间或者是日期的标准)最后累加在一起就可以求出最终的结果

代码示例

public class B {
   
    static  int[] day_month ={
   0,31,28,31,30,31,30,31,31,30,31,30,31};
    /**检查年月日是否合法*/
    public static int check_month(int D){
   
        int M = D/100;//取得月份
        int day = D%100;//取得天数
        if(M<1||M>12)return 0;
        if (day<=1||day>day_month[M])return 0;
        return 1;
    }
    /**判断时间是否合法*/
    public static int check_time(int m){
   
        int H = m/100;//取得小时
        int M = m%100;//取得分钟数
        if (H<0||H>23) return 0;
        if (M<0||M>59) return 0;
        return 1;
    }
    public static void main(String[] args) {
   
        int count=0;//记录匹配个数
        /**因为时间里只包含两个数字,所以我们这里只开两重循环*/
        for (int a = 0; a <= 9; a++)
            for (int b = 0; b <= 9; b++)
                if(a!=b){
   
                int year =4;//两个数字可以匹配到的年份有四种
                int month=0;//与之匹配的月份我们要去做检查月份天数是否成立,所以放在下面赋值
                int time=0;//同上月份一样要放在上边进行与之匹配
                int[] A = new int[]{
   a,a,a,a};
                //枚举四种情况即aaab,aaba,abaa,baaa;
                for (int i = 0; i < 4; i++) {
   
                    A[i]=b;
                    int num = 0;//用来拼接与之对应的情况的数字
                    for (int j = 0; j < 4; j++) {
   
                        num = num * 10 + A[j];
                    }
                    month += check_month(num);
                    time += check_time(num);//与之匹配的时间可能会多,每匹配一次就去加1
                    A[i]=a;
                }
                count+=year*month*time;//每调整一次数字位置就计算一次
            }
        System.out.println(count);
    }
}

C. 纸张尺寸

题目描述

在 ISO国际标准中定义了A0 纸张的大小为1189mm×841mm, 将A0纸沿长边对折后
为A1纸, 大小为841mm× 594mm, 在对折的过程中长度直接取下整 (实际裁剪时可
能有损耗)。将 A1 纸沿长边对折后为A2 纸, 依此类推。
输入纸张的名称, 请输出纸张的大小。

输入格式

输入一行包含一个字符串表示纸张的名称, 该名称一定是 A0、A1、A2、 A3、A4、A5、A6、A7、A8、A9 之一。

输出格式

输出两行,每行包含一个整数,依次表示长边和短边的长度。

输入样例

A0

输出样例

1189
841

解题思路

按照题目详情我们可以知道,要根据输入的纸张型号去输出相对的纸张大小,题目有两种思路:
其一:自己计算出每种纸张的大小,然后通过字符比对去输出相对型号的相对大小(若是自己写不出代码的话建议放弃)
其二:用Integer的pareseInt函数把输入的第二个字符转化成数字,然后通过for循环去计算出与之对应的纸张大小,然后输出
可以把我最后的if else删掉,放在那里只是为了严谨一些

代码示例

import java.util.Scanner;

public class C {
   
    static int Long=1189;
    static int wide=841;
    static String size;//用来获取纸张型号
    static int sizeID;

    public static void main(String[] args) {
   
        Scanner scan = new Scanner(System.in);
        size= scan.next();
        sizeID=Integer.parseInt(String.valueOf(size.charAt(1)));
        for (int i = 0; i < sizeID; i++) {
   
            if (Long > wide) {
   
                Long/=2;
            }else{
   
                wide/=2;
            }
        }
        if (Long > wide) {
   
            System.out.println
### 蓝桥杯中的线段树题目及其解题思路 #### 线段树简介 线段树是一种二叉搜索树,它将一个区间划分为多个小区间并存储在节点中。这种数据结构常用于高效处理区间的查询和更新操作。在线段树的应用场景下,通常可以解决涉及动态数、范围求和、最大值/最小值等问题。 --- #### 蓝桥杯中的典型线段树题目分析 ##### 扫描游戏 —— 线段树应用实例[^2] 此题的核心在于通过线段树实现高效的区间修改与查询功能。具体来说,该问题需要选手能够熟练掌握如何构建线段树以及如何利用懒标记(Lazy Tagging)优化批量更新操作。 为了完成此类题目,参者不仅需要具备扎实的编程基础,还需要有较强的逻辑推理能力和代码设计技巧。 以下是基于线段树的一个简单模板代码示例: ```cpp struct SegmentTree { int tree[4 * MAXN]; // 存储线段树节点信息 void build(int node, int l, int r) { /* 构建线段树 */ } void update(int node, int l, int r, int ul, int ur, int val) { /* 更新指定区间 */ } int query(int node, int l, int r, int ql, int qr) { /* 查询指定区间 */ } }; ``` 上述代码片段展示了线段树的基本框架,其中 `build` 函数负责初始化线段树,而 `update` 和 `query` 则分别对应于区间修改与查询的操作。 --- ##### 翻转括号序列 —— 前缀和与线段树结合[^4] 在这类题目中,目标是对给定字符串执行一系列翻转操作,并判断最终状态是否合法。解决方案的关键点在于维护一段连续子串的状态变化情况。为此,可以通过线段树来记录每一步操作后的前缀和最小值。如果某个时刻发现存在非法状态,则立即返回错误结果;反之则继续计算直至结束。 需要注意的是,在实际编码过程中可能还会涉及到一些边界条件处理以及其他细节调整部分。 --- #### 总结建议 对于准备参加蓝桥杯的学生而言,熟悉并灵活运用诸如线段树这样的高级数据结构至关重要。除了理论学习之外,更应该注重实践练习,尝试解答更多类似的复杂问题以提升自己的综合能力水平[^3]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值