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

系列文章目录

蓝桥杯例题 枚举和模拟


文章目录


前言

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

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


总结

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

相关推荐
安冬的码畜日常16 分钟前
【AI 加持下的 Python 编程实战 2_10】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(中)
开发语言·前端·人工智能·ai·扫雷游戏·ai辅助编程·辅助编程
朝阳58138 分钟前
Rust项目GPG签名配置指南
开发语言·后端·rust
朝阳58139 分钟前
Rust实现高性能目录扫描工具ll的技术解析
开发语言·后端·rust
程高兴40 分钟前
基于Matlab的车牌识别系统
开发语言·matlab
YuforiaCode41 分钟前
第十三届蓝桥杯 2022 C/C++组 修剪灌木
c语言·c++·蓝桥杯
zhang23839061541 小时前
IDEA add gitlab account 提示
java·gitlab·intellij-idea·idea
牛马baby1 小时前
Java高频面试之并发编程-07
java·开发语言·面试
CodeWithMe1 小时前
【C++】STL之deque
开发语言·c++
卓怡学长1 小时前
w304基于HTML5的民谣网站的设计与实现
java·前端·数据库·spring boot·spring·html5
YONG823_API1 小时前
深度探究获取淘宝商品数据的途径|API接口|批量自动化采集商品数据
java·前端·自动化