当前位置: 首页 > article >正文

蓝桥杯 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的倍数。

相关文章:

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

Day 3&#xff1a;枚举算法&#xff08;暴力破解&#xff09; 枚举算法&#xff08;Brute Force&#xff09;是一种 暴力搜索 方法&#xff0c;它通过 遍历所有可能的情况 来找到正确答案。虽然它的 时间复杂度较高&#xff0c;但在 数据范围较小 时&#xff0c;它是一种简单且…...

AI 控制web浏览器基础知识准备,名词解释Xvfb,x11vnc,novnc,playwright,gradio

在探索如何让AI控制Web浏览器实现自动化任务时&#xff0c;了解底层技术栈是关键。本文将解析五个核心组件&#xff1a;Xvfb、x11vnc、novnc、playwright和gradio&#xff0c;这些工具共同构成了AI驱动浏览器的基础架构。 1. Xvfb&#xff08;X Virtual Framebuffer&#xff0…...

C++,STL容器适配器,stack:栈深入解析

文章目录 一、容器概览与核心特性核心特性速览二、底层实现原理1. 容器适配器设计2. 默认容器对比三、核心操作详解1. 容器初始化2. 元素操作接口3. 自定义栈实现四、实战应用场景1. 括号匹配校验2. 浏览器历史记录管理五、性能优化策略1. 底层容器选择基准2. 内存预分配技巧六…...

Vue笔记(十)

一、AI的基本认知 二、ChatGPT的基本使用 三、AI插件--Copilot入门 1.Copilot是由OpenAI和GitHub合作开发的AI编程辅助插件&#xff0c;基于大量代码训练&#xff0c;能根据上下文自动生成代码建议。 2.安装与配置&#xff1a;在常用代码编辑器&#xff08;如Visual Studio Cod…...

Ubuntu下载安装Docker-Desktop

下载 Ubuntu | Docker Docs 预备工作 Ubuntu增加docker apt库-CSDN博客 安装 sudo apt-get updatesudo apt install gnome-terminal# sudo apt install -y docker-composesudo apt-get install ./docker-desktop-amd64.deb 测试 sudo docker run hello-worldHello from D…...

DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?

随着人工智能技术的飞速发展&#xff0c;大模型领域不断涌现出具有创新性的成果。DeepSeek 的横空出世&#xff0c;为 AI 大模型领域带来了新的变革浪潮。本文将深入探讨 DeepSeek 出现后 AI 大模型面临的危机与转机。 冲冲冲&#xff01;&#xff01;&#xff01; 目录 一、…...

C#运动控制——轴IO映射

1、IO映射的作用 该功能允许用户对专用 IO 信号的硬件输入接口进行任意配置&#xff0c;比如轴的急停信号&#xff0c;通过映射以后&#xff0c;可以将所有轴的急停信号映射到某一个IO输入口上&#xff0c;这样&#xff0c;我们只要让一个IO信号有效就可以触发所有轴的急停。 进…...

ArrayList、LinkedList、HashMap、HashTable、HashSet、TreeSet

集合族谱 在这些集合中&#xff0c;仅有vector和hashtable是线程安全的&#xff0c;其内部方法基本都有synchronized修饰。 ArrayList 底层采用Object数组实现&#xff0c;实现了RandomAccess接口因此支持随机访问。插入删除操作效率慢。 ArrayList需要一份连续的内存空间。 A…...

DeepSeek 指导手册(入门到精通)

第⼀章&#xff1a;准备篇&#xff08;三分钟上手&#xff09;1.1 三分钟创建你的 AI 伙伴1.2 认识你的 AI 控制台 第二章&#xff1a;基础对话篇&#xff08;像交朋友⼀样学交流&#xff09;2.1 有效提问的五个黄金法则2.2 新手必学魔法指令 第三章&#xff1a;效率飞跃篇&…...

window 11 鼠标右键切换回经典模式

window 11 鼠标右键切换回经典模式 在换新电脑&#xff0c;更新到 window 11 后&#xff0c;鼠标右键很不习惯&#xff0c;把很多功能都隐藏到最后一个打开更多模块了&#xff0c;删除以及刷新等操作也不能使用右键字母快捷操作。 恢复window 11 右键菜单到经典模式 方法一&am…...

RabbitMQ 延迟队列

1.延迟队列插件安装(版本号要对其&#xff09; Releases rabbitmq/rabbitmq-delayed-message-exchange GitHub 下载的文件: rabbitmq_delayed_message_exchange-3.13.0.ez 直接复制到以下文件夹&#xff1a; \RabbitMQ Server\rabbitmq_server-3.13.7\plugins\ 执行命令…...

Unity3D 类MOBA角色控制器 开箱即用

Github: Unity3D-MOBA-Character-Controller 觉得好用麻烦点个Star感谢&#xff01;...

认识一下redis的分布式锁

Redis的分布式锁是一种通过Redis实现的分布式锁机制&#xff0c;用于在分布式系统中确保同一时刻只有一个客户端可以访问某个资源。它通常用于防止多个应用实例在同一时间执行某些特定操作&#xff0c;避免数据的不一致性或竞争条件。 实现分布式锁的基本思路&#xff1a; 1. …...

【CXX】0 Rust与C ++的互操作利器:CXX库介绍与示例

CXX库是一个非常强大的工具&#xff0c;它使得Rust和C之间的互操作性变得既安全又高效。本专栏将展示如何使用CXX库来桥接Rust和C代码&#xff0c;同时保持两者语言的特性和惯用法。 一、关键概念 类型安全&#xff1a;CXX库通过静态分析类型和函数签名来保护Rust和C的不变量…...

2024 CyberHost 语音+图像-视频

项目&#xff1a;CyberHost: Taming Audio-driven Avatar Diffusion Model with Region Codebook Attention 音频驱动的身体动画面临两个主要挑战&#xff1a;&#xff08;1&#xff09;关键人体部位&#xff0c;如面部和手部&#xff0c;在视频帧中所占比例较小&#x…...

企业文件安全:零信任架构下的文件访问控制

在企业数字化转型的进程中&#xff0c;传统的文件访问控制模型已难以满足日益复杂的网络安全需求。零信任架构作为一种新兴的安全理念&#xff0c;为企业的文件安全访问提供了全新的解决方案。 一、传统文件访问控制的局限性 传统的文件访问控制主要基于网络边界&#xff0c;…...

Rasa学习笔记

一、CALM 三个关键要素&#xff1a; 业务逻辑&#xff1a;Flow&#xff0c;描述了AI助手可以处理的业务流程对话理解&#xff1a;旨在解释最终用户与助手沟通的内容。此过程涉及生成反映用户意图的命令&#xff0c;与业务逻辑和正在进行的对话的上下文保持一致。自动对话修复…...

list_for_each_entry_safe 简介

list_for_each_entry_safe 是 Linux 内核中用于遍历链表的一个宏&#xff0c;特别适用于在遍历过程中可能需要删除链表节点的场景。它的设计保证了在删除当前节点时&#xff0c;不会影响后续节点的访问&#xff0c;从而实现安全的遍历。 定义 #define list_for_each_entry_sa…...

Android 系统面试问题

一.android gki和非gki的区别 Android GKI&#xff08;Generic Kernel Image&#xff09;和非GKI内核的主要区别在于内核设计和模块化程度&#xff0c;具体如下&#xff1a; 1. 内核设计 GKI&#xff1a;采用通用内核设计&#xff0c;与设备硬件分离&#xff0c;核心功能统一…...

【面试集锦】如何设计SSO方案?和OAuth有什么区别?

如何设计SSO方案?和OAuth有什么区别?--楼兰 带你聊最纯粹的Java ​ 如果面试问你,你会做一个权限系统吗?那你肯定会说做过。不就是各种登录、验证吗。我做的第一个CRUD应用就是注册、登录。简单!但是,如果问你在工作中真的做过权限系统吗?其实很多人都只能默默摇摇头。因…...

二十六、使用docsify搭建文档管理平台

特性 无需构建,写完文档直接发布容易使用并且轻量 (~19kB gzipped)智能的全文搜索提供多套主题丰富的 API...

bitcoinjs学习1—P2PKH

1. 概述 在本学习笔记中&#xff0c;我们将深入探讨如何使用 bitcoinjs-lib 库构建和签名一个 P2PKH&#xff08;Pay-to-PubKey-Hash&#xff09; 比特币交易。P2PKH 是比特币网络中最常见和最基本的交易类型之一&#xff0c;理解其工作原理是掌握比特币交易构建的关键。 想要详…...

如何在 Java 应用中实现数据库的主从复制(读写分离)?请简要描述架构和关键代码实现?

在Java应用中实现数据库主从复制&#xff08;读写分离&#xff09; 一、架构描述 &#xff08;一&#xff09;整体架构 主库&#xff08;Master&#xff09; 负责处理所有的写操作&#xff08;INSERT、UPDATE、DELETE等&#xff09;。它是数据的源头&#xff0c;所有的数据变…...

【pytest】获取所有用例名称并存于数据库

数据库操作包&#xff0c;引用前面创建的py文件&#xff0c;【sqlite】python操作sqlite3&#xff08;含测试&#xff09; #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2025-02-11 8:45 # Author : duxiaowei # File : get_filename.py # Software: 这个文…...

【论文笔记】Are Self-Attentions Effective for Time Series Forecasting? (NeurIPS 2024)

官方代码https://github.com/dongbeank/CATS Abstract 时间序列预测在多领域极为关键&#xff0c;Transformer 虽推进了该领域发展&#xff0c;但有效性尚存争议&#xff0c;有研究表明简单线性模型有时表现更优。本文聚焦于自注意力机制在时间序列预测中的作用&#xff0c;提…...

maven导入spring框架

在eclipse导入maven项目&#xff0c; 在pom.xml文件中加入以下内容 junit junit 3.8.1 test org.springframework spring-core ${org.springframework.version} org.springframework spring-beans ${org.springframework.version} org.springframework spring-context ${org.s…...

AUTOGPT:基于GPT模型开发的实验性开源应用程序; 目标设定与分解 ;;自主思考与决策 ;;信息交互与执行

目录 AUTOGPT是一款基于GPT模型开发的实验性开源应用程序目标设定与分解自主思考与决策信息交互与执行AUTOGPT是一款基于GPT模型开发的实验性开源应用程序 目标设定与分解 自主思考与决策 信息交互与执行 AUTOGPT是一款基于GPT模型开发的实验性开源应用程序,它能让大语言模…...

瑞芯微开发板/主板Android调试串口配置为普通串口方法 深圳触觉智能科技分享

本文介绍瑞芯微开发板/主板Android调试串口配置为普通串口方法&#xff0c;不同板型找到对应文件修改&#xff0c;修改的方法相通。触觉智能RK3562开发板演示&#xff0c;搭载4核A53处理器&#xff0c;主频高达2.0GHz&#xff1b;内置独立1Tops算力NPU&#xff0c;可应用于物联…...

Redis 数据类型 Hash 哈希

在 Redis 中&#xff0c;哈希类型是指值本⾝⼜是⼀个键值对结构&#xff0c;形如 key "key"&#xff0c;value { { field1, value1 }, ..., {fieldN, valueN } }&#xff0c;Redis String 和 Hash 类型⼆者的关系可以⽤下图来表⽰。 Hash 数据类型的特点 键值对集合…...

IntelliJ IDEA 2024.1.4版无Tomcat配置

IntelliJ IDEA 2024.1.4 (Ultimate Edition) 安装完成后&#xff0c;调试项目发现找不到Tomcat服务&#xff1a; 按照常规操作添加&#xff0c;发现服务插件中没有Tomcat。。。 解决方法 1、找到IDE设置窗口 2、点击Plugins按钮&#xff0c;进入插件窗口&#xff0c;搜索T…...