【蓝桥杯】 枚举和模拟练习题

系列文章目录

蓝桥杯例题 枚举和模拟


文章目录


前言

今天距离蓝桥杯还有13天,时间不多了,我也在复习,而我们最容易掌握的就是暴力来写题,因此今天给大家补充两道枚举和模拟类的题,下面是我的讲解过程。


一、好数:

题目参考:

核心思想:

其实好数这道题就是典型的枚举,因为我们需要把从1开始枚举到我们输入的数来判断这个数是不是好数,所以我们要枚举来找是不是符合条件就对了。

代码实现:
java 复制代码
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 count = 0;
          for(int i = 1;i<=N;i++){
               count +=solve(i);
          }
        System.out.println(count);



        scan.close();
    }
    public static int solve(int num){
      //这是进行每个数的分解位数的基本操作
            int digit = 1;//用来维护奇偶数位的
         while(num>0){
            int t = num%10;//这里面的细节就是从个位开始取
            if(digit % 2 == 1){
                 if(t%2 == 0){
                    return 0;
                 }  
            }else{
                 if(t%2 == 1){
                    return 0;
                 }
            }
             num/=10;
            digit++;
         }
       return 1;

    }
}

这道题我认为较重要需要掌握的就是如何从个位依次得到每一位,这在许多地方都需要使用这个固定模板。

二、艺术与篮球:

题目参考:

核心思想:

这个日期格式的题也是一个枚举模拟的题,非常典型,这个就体现出来了数组的重要性,我们分别把笔画和每月的天数存到数组当中,其实也可以用HashMap键值对来存,这里面我们用数组来存,然后就是计算笔画权值跟50来进行比较,从2000枚举到2024年4月13号。

代码实现:
java 复制代码
public class Main {
    // 每月天数数组,平年默认2月28天
    static int[] months = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    static int[] hz = {13, 1, 2, 3, 5, 4, 4, 2, 2, 2}; // 数字对应的权值

    // 判断是否为闰年
    public static boolean leap(int year) {
        return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
    }

    public static void main(String[] args) {
        solve();
    }

    public static void solve() {
        int ans = 0; // 符合条件的日期个数

        // 遍历年份
        for (int year = 2000; year <= 2024; year++) {
            // 根据年份来确定2月份是闰年还是平年
            months[2] = leap(year) ? 29 : 28;

            // 遍历月份
            for (int month = 1; month <= 12; month++) {
                // 遍历每天
                for (int day = 1; day <= months[month]; day++) {
                    int cnt = 0; // 日期的权值总和
                    int y1, y2, y3, y4, m1, m2, d1, d2;

                    // 提取年份、月份和日期的各个位
                    y1 = year / 1000;
                    y2 = (year / 100) % 10;
                    y3 = (year / 10) % 10;
                    y4 = year % 10;
                    m1 = month / 10;
                    m2 = month % 10;
                    d1 = day / 10;
                    d2 = day % 10;

                    // 计算日期权值总和
                    cnt = hz[y1] + hz[y2] + hz[y3] + hz[y4] + hz[m1] + hz[m2] + hz[d1] + hz[d2];

                    // 如果日期的权值总和大于50,符合条件
                    if (cnt > 50) {
                        ans++;
                    }

                    // 当到达2024年4月13日时输出并结束
                    if (year == 2024 && month == 4 && day == 13) {
                        System.out.println(ans);
                        return;
                    }
                }
            }
        }
    }
}

像这里面我们也有一个模板来得到每一位,所以这个模板我们一定要记得,就是如果求每一位是如何得到的。


总结

以上就是这两道题的见解,其实这种枚举和模拟的题就是找出来相应的条件来进行枚举,找出符合的,其实这个没有什么难的,就是分析好这个过程就行,接下来我会持续更新蓝桥杯的经典例题的,谢谢大家。

相关推荐
FQNmxDG4S7 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
穿条秋裤到处跑8 小时前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
前端老石人8 小时前
HTML 字符引用完全指南
开发语言·前端·html
matlab_xiaowang8 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
虹科网络安全8 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje8 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv79 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫9 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287929 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本9 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka