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

系列文章目录

蓝桥杯例题 枚举和模拟


文章目录


前言

今天距离蓝桥杯还有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;
                    }
                }
            }
        }
    }
}

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


总结

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

相关推荐
什巳1 小时前
JAVA练习278- 和为 K 的子数组
java·学习·算法·leetcode
豆瓣鸡1 小时前
RocketMQ学习-Spring Boot消息实践
java·spring boot·rocketmq
喜欢的名字被抢了1 小时前
Python实战:SQLAlchemy ORM与FastAPI项目集成
开发语言·python·sql·教程·fastapi
罗超驿2 小时前
2.算法效率的核心密码:时间复杂度和空间复杂度详解
java·数据结构·算法
栈溢出了3 小时前
Redis 分片集群与哈希槽笔记
java·redis·笔记·spring
遨游DATA3 小时前
Spring Boot 启动失败排查:如何区分多 Bean 冲突与清理阶段异常
java·spring boot·后端
我命由我123453 小时前
复利极简理解
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
从零开始的代码生活_3 小时前
C++ 内存管理:从内存分区到 new/delete 底层原理
开发语言·c++·后端
wabs6664 小时前
关于单调栈【力扣739.每日温度的思考】
java·开发语言
AOwhisky4 小时前
Python 学习笔记(第三期)——流程控制核心知识点自测与详解
开发语言·笔记·python·学习·云原生·运维开发·流程控制