蓝桥杯之枚举算法

一.什么是枚举算法

    这种算法是一种通过列举出所有情况解决问题的算法

1.基本思想

     枚举算法就是将解空间当中所有的情况全都列出来,进行比较和分析,之后再选出最优解。

     那么什么是解空间呢?

     解空间可以是一个范围内的所有数字,也可以是在特定条件下的数字。当然解空间还有解空间树,这个就需要利用到之后的回溯了,我们这里先不去讨论这个问题,当前的问题仅局限于除空间树外的所有问题!

2.适用范围

    可适用于解空间可穷举,规模较小的一些问题

二.相关习题

1.反倍数

       我们先来分析题目,题目要求在给定的范围内,在随机取a,b,c三个数字 看在这个范围内存在几个不是a,b,c的整数倍的数字。然后最后将有几个数字输出来。我们不妨可以先想一下,我们先定义上限(即n),count(即数字的个数)。之后利用一个for循环,遍历从1到n的所有数字,看他们是否是a,b,c的整数倍。如果不是的话,那么就count++;直至遍历完。最后输出count,这就是我们想要的答案。那么问题又来了,这个判断应该怎样判断呢?我们首先想到的肯定是利用if条件语句来实现判断。那么我们可以在主函数for循环当中设置一个if判断语句,这是解题思路。那么if的条件怎么设置呢?解决方法就是在主函数之外设定一个判断函数,如果说这个数字同时不是a,b,c的整数倍,那么,我们可以将函数值输出为1,否则为0.通过这个函数,就得到了判断的条件。这就为本题的解题思路!

下面为代码实现:
 

#include <stdio.h>
#include <stdlib.h>
int a,b,c;
int test(int x)
{
  if(x%a&&x%b&&x%c)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}
int main(int argc, char *argv[])
{
  int n;
  scanf("%d",&n);
  scanf("%d%d%d",&a,&b,&c);
  int i,count=0;
  for(i=1;i<=n;i++)
  {
    if(test(i))
    {
       count++;
    }
  }
  printf("%d",count);
  return 0;
}

2.特别数的和

        我们先来分析题目,题目要求在给定的范围内,取出包含2,0,1,9的数字。算出他们之和。

        与上题相同主函数的思路还是一样的,只不过是判断方法有所区别。判断方法是先将数字x拆开,分为个位,十位,甚至是百位。然后通过判断这几位是否是2,0,1,9。如果是的话则输出结果为1,否则为0。那么,应该怎样输出数字的十位,各位呢。我们不妨可以在草稿纸上试验一下,举一个简单的例子23,如果需要取出它的个位数字,需要将其除10取余。再将取余出来的这个数字赋给一个变量,对这个变量进行判断。之后再将得到的除数赋给原来的数字x,利用for循环重复操作。直至条件为0。 

下面为代码设计实现:

#include <iostream>
using namespace std;
int test(int x)
{
  while(x)
  {
    int y=x%10;
    if(y==2||y==0||y==1||y==9)
    {
      return 1;
    }
    x=x/10;
  }
  return 0;
}
int main()
{
  int n;
  cin>>n;
  int sum=0;
  for(int i=1;i<=n;++i)
  {
    if(test(i))
    {
      sum+=i;
    }
  }
 cout<<sum<<'\n';
  return 0;
}

       以上为关于枚举算法的基本阐述。宝剑锋从磨砺出,梅花香自苦寒来。在学习算法的道路上,是十分艰巨的。这就需要我们,以及其认真的态度。将算法运用到代码当中,让代码活跃起来!(此外在设计代码的过程当中,主要采用了c语言,如有其他语言的实现,可以分享出来和大家一块交流。)

### 关于蓝桥杯竞赛中的Python枚举蓝桥杯竞赛中,枚举作为一种基本算法策略被广泛应用。当面对复杂问题而难以快速找到最优解时,可以通过枚举来逐一验证所有潜在解决方案。 #### 枚举的应用场景 对于某些特定类型的题目,在没有明显规律可循的情况下,采用枚举方法不失为一种有效手段。通过遍历所有可能性并进行条件校验,最终筛选出满足要求的答案[^4]。 #### 实际案例分析 考虑一道典型的枚举示例题——寻找数组内的最大连续子序列和: 假设给定一个整数列表`nums=[-2,1,-3,4,-1,2,1,-5,4]`,目标是从该列表中找出具有最大累加值的连续子数组,并返回其总和。 ##### 解决方案思路 由于此题目的核心在于考察如何高效处理数据结构以及理解动态规划概念之前的基础操作,因此可以利用双重循环实现最基础版本的枚举逻辑,即对每一个起始位置i及其后的结束位置j计算区间[i,j]内元素之和的最大值。 ```python def max_subarray_sum(nums): n = len(nums) result = float('-inf') for i in range(n): # 遍历起点 current_sum = 0 for j in range(i,n): # 对应终点 current_sum += nums[j] if current_sum > result: result = current_sum return result ``` 上述代码展示了怎样运用两层嵌套for循环完成一次完整的枚举过程,尽管效率较低(O(N^2)),但在小型输入规模下仍能正常工作并且易于理解和编写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值