蓝桥杯 Java B 组之枚举算法(暴力破解)

Day 3:枚举算法(暴力破解)

枚举算法(Brute Force)是一种 暴力搜索 方法,它通过 遍历所有可能的情况 来找到正确答案。虽然它的 时间复杂度较高,但在 数据范围较小 时,它是一种简单且有效的解法。

本日的学习目标:

  • 掌握 暴力枚举 的方法
  • 优化枚举范围,提高效率
  • 练习 水仙花数百钱买百鸡 等经典问题


�� 一、什么是枚举算法?

枚举算法(Brute Force)即 穷举所有可能的情况,然后筛选出符合条件的解。

�� 适用场景

  • 数据规模较小(n ≤ 10^4)
  • 无更优算法
  • 暴力法可以解决问题


�� 二、枚举基本模板

for (int i = 0; i < n; i++) {

    for (int j = 0; j < m; j++) {

        if (满足条件) {

            处理当前解;

        }

    }

}

�� 如何优化枚举?

  1. 缩小遍历范围,减少无效计算
  2. 提前终止循环,避免不必要的计算
  3. 利用数学特性,减少不必要的枚举


�� 三、经典练习题

�� 练习 1:水仙花数

�� 题目描述

  • 一个 3 位数,如果 每个数字的立方和等于它本身,就称它为 水仙花数
  • 例如:153 = 1^3 + 5^3 + 3^3,所以 153 是水仙花数。
  • 求出所有 100~999 之间的水仙花数。

�� 解法分析

  • 100 ≤ num ≤ 999
  • 分解成 百位、十位、个位 后 求立方和
  • 检查是否等于 num 本身

代码实现

public class NarcissisticNumber {

    public static void main(String[] args) {

        for (int num = 100; num <= 999; num++) {

            int a = num / 100;        // 百位

            int b = (num / 10) % 10;  // 十位

            int c = num % 10;         // 个位

            if (num == (a * a * a + b * b * b + c * c * c)) {

                System.out.println(num);

            }

        }

    }

}

优化点

  • 减少重复计算,a, b, c 直接计算,而不是使用 String 转换
  • 时间复杂度 O(900),可接受

�� 练习 2:百钱买百鸡问题

�� 题目描述

  • 公鸡 5 钱一只,母鸡 3 钱一只,小鸡 1 钱买 3 只。
  • 用 100 钱买 100 只鸡,问所有的购买方案。

�� 解法分析

  • 设:
    • x 为公鸡数量(0 ≤ x ≤ 20,因为 5x ≤ 100)
    • y 为母鸡数量(0 ≤ y ≤ 33,因为 3y ≤ 100)
    • z 为小鸡数量(z = 100 - x - y)
  • 方程 5x+3y+z/3=1005x + 3y + z / 3 = 100
    • 小鸡数量必须是 3 的倍数(z % 3 == 0)

代码实现

public class HundredChickens {

    public static void main(String[] args) {

        for (int x = 0; x <= 20; x++) {  // 公鸡最多 20 只

            for (int y = 0; y <= 33; y++) {  // 母鸡最多 33 只

                int z = 100 - x - y;  // 计算小鸡数量

                if (z % 3 == 0 && (5 * x + 3 * y + z / 3 == 100)) {

                    System.out.println("公鸡: " + x + ", 母鸡: " + y + ", 小鸡: " + z);

                }

            }

        }

    }

}

优化点

  • 缩小 x 和 y 的范围
  • z 必须是 3 的倍数,减少不必要的计算


�� 四、枚举优化技巧

�� 优化 1:缩小范围

  • 直接枚举所有情况会超时
  • 分析问题,减少不必要的枚举
  • 示例:百钱买百鸡问题 
    • x 最大值是 100/5=20
    • y 最大值是 100/3=33
    • z % 3 == 0

�� 优化 2:提前终止

  • 如二分查找,若找到了目标值,直接退出循环

�� 优化 3:利用数学特性

  • 例如 水仙花数,如果 num < 100,就不需要检查 num == a^3 + b^3 + c^3,直接跳过。


�� 五、蓝桥杯枚举常考点

考点

典型题目

优化技巧

水仙花数

153, 370, 371, 407

直接计算 a^3 + b^3 + c^3

百钱买百鸡

5x + 3y + z/3 = 100

缩小 x,y 的范围

整数拆分

100 拆分为若干整数之和

动态规划

数字统计

统计 1-1000 里 1 出现的次数

数学推导优化


�� 六、易错点总结

误解枚举范围

for (int x = 0; x < 100; x++) {  // ❌ 范围过大,浪费计算

优化

for (int x = 0; x <= 20; x++) {  // ✅ 设定合理范围

忘记提前终止

if (找到目标) {

    continue;  // ❌ 没有提前终止,导致无意义计算

}

优化

if (找到目标) {

    break;  // ✅ 立即终止循环

}

计算不必要的情况

for (int x = 0; x <= 100; x++) {  

    for (int y = 0; y <= 100; y++) {  

        for (int z = 0; z <= 100; z++) {  // ❌ 遍历过大

优化

for (int x = 0; x <= 20; x++) {  

    for (int y = 0; y <= 33; y++) {  

        int z = 100 - x - y;  // ✅ 直接计算 z


七、枚举算法框架模板

public class EnumerationTemplate {

    public static void main(String[] args) {

        // 1. 确定枚举范围

        for (int var1 = min1; var1 <= max1; var1++) {

            // 剪枝:跳过不可能的情况

            if (condition1) continue;

            for (int var2 = min2; var2 <= max2; var2++) {

                // 剪枝:进一步优化

                if (condition2) break;

                // 2. 计算候选解

                int candidate = calculate(var1, var2);

                // 3. 验证条件

                if (isValid(candidate)) {

                    System.out.println(candidate);

                }

            }

        }

    }

    private static int calculate(int a, int b) {

        return a + b; // 根据问题定义计算

    }

    private static boolean isValid(int value) {

        return value == target; // 根据问题定义验证

    }

}

八、知识点总结

  • 枚举算法的基本思想:将问题的所有可能解一一列举出来,然后逐一检查是否满足条件。
  • 枚举范围的确定:根据问题的条件和约束,确定变量的取值范围,避免不必要的枚举,提高算法效率。
  • 变量关系的利用:分析变量之间的关系,利用这些关系减少枚举的变量数量,简化问题。

蓝桥杯常考点

  • 枚举算法的应用:在蓝桥杯的题目中,经常会出现一些需要使用枚举算法解决的问题,如寻找满足特定条件的数字组合、排列等。
  • 优化枚举范围:考查选手是否能够分析问题的条件,找出变量的合理取值范围,对枚举算法进行优化,避免超时。
  • 边界条件处理:在枚举过程中,需要注意边界条件的处理,确保枚举的范围正确,不遗漏可能的解。

蓝桥杯易错点

  • 枚举范围过大:没有对问题进行深入分析,直接枚举所有可能的情况,导致算法效率低下,在规定时间内无法得出结果。
  • 边界条件错误:在确定枚举范围时,边界条件设置错误,可能会遗漏某些解或者枚举到无效的情况。
  • 逻辑错误:在检查解是否满足条件时,逻辑判断出现错误,导致结果不准确。例如,在百钱买百鸡问题中,忘记检查小鸡数量是否为 3的倍数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/969107.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek R1本地部署 DeepSeek Api接口调用 java go版本

1、本地ollama的API接口 接着上一章所本地部署deepseek&#xff0c;这一章我们调用ollama api 对应的curl&#xff1a; curl --request POST \--url http://localhost:11434/api/generate \--header Accept: */* \--header Accept-Encoding: gzip, deflate, br \--header Con…

springboot021校园周边美食探索及分享平台

版权声明 所有作品均为本人原创&#xff0c;提供参考学习使用&#xff0c;如需要源码数据库配套文档请移步 www.taobysj.com 搜索获取 技术实现 开发语言&#xff1a;Javavue。 框架&#xff1a;后端spingboot前端vue。 模式&#xff1a;B/S。 数据库&#xff1a;mysql。 开…

肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)

大家好&#xff01;我是凯哥&#xff0c;今天给大家分享一下云计算学习路线图。这是我按照自己最开始学习云计算的时候的学习路线&#xff0c;并且结合自己从业多年所涉及的知识精心总结的云计算的思维导图。这是凯哥精心总结的&#xff0c;花费了不少精力哦&#xff0c;希望对…

初禹笔记(IOS 应用)帮助支持页面

简介 一个 iCloud 实时同步的笔记工具&#xff0c;支持markdown 格式解析、分享 PDF文件。 方便存储各种AI生成的markdown 格式回答&#xff0c;自动保存到 iCloud 永不丢失&#xff0c;支持分享为 PDF 格式笔记。 联系方式 如果您在使用过程中有任何问题或建议&#xff0c;…

SolidWorks速成教程P3-1【零件 | 第一节】——特征成型介绍拉伸凸台/基体与设计树

零件是由特征构成的&#xff0c;所以零件学习也叫做特征学习。 特征命令&#xff0c;我们可以认为是将二维草图变成三维实体的过程&#xff0c;学习完成后我们就能画出很多东西了&#xff0c;比如画一台手机的外形&#xff0c;学完后我们一起画一个手机支架&#xff0c;来熟练…

MyBatis映射文件 <resultMap> 元素详解与示例

引言 <resultMap> 是 MyBatis 中最核心的映射配置元素&#xff0c;用于解决数据库字段与 Java 对象属性之间的复杂映射问题&#xff0c;尤其是字段名不一致、嵌套对象关联、集合映射等场景。ResultMap 的设计思想是&#xff0c;对简单的语句做到零配置&#xff0c;对于复…

在ArcGIS JS API中使用WebGL实现波纹扩散特效

在现代WebGIS开发中&#xff0c;ArcGIS JS API 是一个非常强大的工具&#xff0c;它允许开发者创建丰富的地理信息应用。结合WebGL技术&#xff0c;我们可以实现更加复杂和炫酷的可视化效果。本文将介绍如何使用ArcGIS JS API结合WebGL实现一个波纹扩散特效。 波纹扩散效果 1 概…

基于Java的图书管理网站:SpringBoot+Vue开发的图书借阅管理系统

基于Java的图书管理网站&#xff1a;SpringBootVue开发的图书借阅管理系统 引言 随着信息技术的飞速发展&#xff0c;传统的图书借阅方式已逐渐向智能化、信息化方向转变。为了提高图书管理的效率和用户的借阅体验&#xff0c;基于Java、SpringBoot和Vue开发了一套图书借阅管…

MongoDB 7 分片副本集升级方案详解(上)

#作者&#xff1a;任少近 文章目录 前言&#xff1a;Mongodb版本升级升级步骤环境1.1环境准备1.2standalone升级1.3分片、副本集升级 前言&#xff1a;Mongodb版本升级 在开始升级之前&#xff0c;请参阅 MongoDB下个版本中的兼容性变更文档&#xff0c;以确保您的应用程序和…

Lua闭包的使用以及需要注意的问题

1. 闭包的基本概念 在 Lua 中&#xff0c;闭包是一个函数值&#xff0c;它包含了函数本身以及该函数所创建时的环境。闭包允许函数访问其外部函数作用域中的变量&#xff0c;即使外部函数已经执行完毕。 2.闭包的简单使用 代码&#xff1a;在下面的代码中&#xff0c;create…

第12周:LSTM(火灾温度)

1.库以及数据的导入 1.1库的导入 import torch.nn.functional as F import numpy as np import pandas as pd import torch from torch import nn1.2数据集的导入 data pd.read_csv("woodpine2.csv")dataTimeTem1CO 1Soot 100.00025.00.0000000.00000010.22825.…

日志结构化处理:PO对象toString日志转JSON工具

日志结构化处理&#xff1a;PO对象toString日志转JSON工具 1. 解决的问题2. 下载地址 在Java项目中&#xff0c;PO&#xff08;Plain Old Java Object&#xff09;对象遍布各个角落&#xff0c;且常常伴随着大量的日志记录需求。传统的做法是通过toString方法直接打印这些对象&…

QML 快捷键与Shortcut的使用

一、效果展示 二、源码分享 import QtQuick import QtQuick.Controls import Qt.labs.qmlmodels import QtQuick.Controls.Basic import QtQuick.Layouts import QtQuick.Effects import Qt.labs.platformApplicationWindow {id:rootwidth: 1000height: 730visible: truetitle…

蓝桥杯之并查集

算法思想 并查集是一种树形的数据结构&#xff0c;主要用于解决一些元素分组问题。用于处理一些不相交集合的合并以及查询问题。并查集的思想是用一个数组表示了整片森林&#xff0c;树的根节点唯一标识了一个集合&#xff0c;我们只要找到了某个元素的树根&#xff0c;就能确…

Qt多线程技术【线程池】:QRunnable 和 QThreadPool

在现代软件开发中&#xff0c;尤其是在处理大量并发任务时&#xff0c;线程池技术是一种高效的解决方案。线程池不仅能提高程序的性能&#xff0c;还能有效管理线程的生命周期&#xff0c;避免频繁的线程创建和销毁所带来的性能损失。本文将以Qt中的 QThreadPool 和 QRunnable …

链表 —— 常用技巧与操作总结详解

引言 链表作为一种动态数据结构&#xff0c;以其灵活的内存管理和高效的插入删除操作&#xff0c;在算法与工程实践中占据重要地位。然而&#xff0c;链表的指针操作复杂&#xff0c;容易引发内存泄漏和野指针问题。本文博主将从基础操作到高阶技巧&#xff0c;系统化解析链表的…

Renesas RH850 FDL库介绍

文章目录 FDL库(Data Flash Library)简介FDL库的核心功能FDL库的使用步骤关键注意事项示例应用场景总结FDL库(Data Flash Library)简介 FDL(Data Flash Library)是Renesas为RH850系列微控制器提供的数据闪存(Data Flash)操作库,用于简化数据闪存的擦除、写入、读取等…

Linux 配置 MySQL 定时自动备份到另一台服务器

Linux 配置 MySQL 定时自动备份到另一台服务器 前言1、配置服务器通信1.1&#xff1a;配置过程 2、编写自动备份sh脚本文件3&#xff1a;设置定时自动执行 前言 此方案可使一台服务器上的 MySQL 中的所有数据库每天 0 点自动转储为 .sql 文件&#xff0c;然后将文件同步到另一…

用php tp6对接钉钉审批流的 table 表格 明细控件 旧版sdk

核心代码 foreach ($flows[product_list] as $k>$gift) {$items_list[] [[name > 商品名称, value > $gift[product_name] ?? ],[name > 规格, value > $gift[product_name] ?? ],[name > 数量, value > $gift[quantity] ?? ],[name > 单位, v…

RV1126解码(1)

比如我们现在要拉一个流&#xff0c; 拉一个rtmp或者拉一个rtsp的流&#xff0c;让它显示到显示屏上面去&#xff0c;此时就要用到我们这个解码模块了&#xff0c;把它个解出来并且发到其他模块去。 主要功能是通过FFMPEG的API读取每一帧的音视频数据&#xff0c;并通过RV1126的…