暴力&枚举的认识

1, 前言

记录一下叭,好久没有更新了。其实也在一直写博客、刷题,没有发,也没有写完。

最近在刷题,刚刚开始刷题,为了应对比赛。

lg刷题记录

蓝桥杯刷题记录

练习

先看这三张图叭,截止到目前刷了这多。这些不算多,但我已经尽力了。。。哈哈

刷题刷了这么多,有些地方还是不懂,但是还是悟出了一些道理。

这篇记录我想围绕暴力枚举来说一说我的一些见解。可能也有一些错误,大家多多指正。

2,枚举法

2.1,初理解

暴力,这个词语是贬义词。用力,大力出奇迹。

枚举,把所有可能性全部列举出来。

暴力枚举,用最最最原始粗野的方法把一切结果全部列举出来。

初理解这个标题可能是在这篇文章里可以说是最初的理解与解释,但对我来说不是。

一开始我对暴力二字没有什么感觉,不知所措。而枚举,一开始我以为是C语言结构里的一种。就像结构体,我去哔哩哔哩,还真有与枚举的解释,但是是枚举型。我还对着敲了代码。

枚举型

学习了这个我就接着刷题。就没了。

但是在我刷题的时候标签是枚举、暴力,但我完全没有用到这种数据类型。

更多的是for 循环、嵌套for 循环、if 条件判断语句。所以我在这里有一些觉悟。、

什么是暴力枚举。用for 循环把该有的结果全部遍历出来,之后在做筛选。

if语句判断这个答案是不是我们需要的,不是舍去,反之保留。

这就是初理解。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1kAr4riC-1647601806544)(https://cdn.jsdelivr.net/gh/yanghuanh1314/MyPicture@master/暴力枚举.png)]

网上也是这么说的。

2.2,解题思路

首先我们应该确定枚举范围,不能多,不能少,要不然就容易漏掉一个,万一是正确答案呢?

确定了枚举范围,就想应该用什么方式枚举,单层for循环或者嵌套。

这些都完成后,就可以开始筛选答案了。

是要全部打印,还是输出数量,打印printf,计数ans

3,例题

就是以上四步,看的很容易,但是做起来是很难,可能是刚刚开始接触。这一部分也有人称为思维题,

试题一:门牌制作

门牌制作

这是2020年蓝桥杯省赛的一道题,这道题我没有借助任何题解做出来的,属实简单。

简单的概括一下,现在有2020家用户,现在要贴门牌号。然后还举了一个例字

问:共需要多少个字符2。0带2020一共有多少个2出现。

先枚举,确定范围2020,一共有2020家。

然后在这里可能就有迷住了。数位拆分。比如说拆分2018,那么它是有2、0、1、8组成。所以逐一对每一个数进行拆分。

这里枚举部分就已经差不多完成了,现在该筛选了。他说问有多少2。用if语句,后面加个ans。

打印输出。

这道题是一道很简单的枚举。很意外。

试题2:卡片

卡片

这是2021年的真题,做的我真是感觉有思路但不会写,最后在题解的帮助下写出来的。

还是简单的枚举。

有0到9卡片拼数,拼一个这张卡片就不用了,现在又卡片20210张,0到9个2021张,问可以拼到几。

这道题先定义了一个数组a[11] 用来存放卡片的个数for(int i=o; i<11;i++) a[i]=2021 这个数组用来计数,一开始我也很迷惑,怎么怎么计数,它是用下角标计数,a[0]=2021 a[1]=2021 a[2]=2021 ... a[9]=2021

然后接着看第二个循环for(int i=1;i++) 单看是没有限制条件,一直循环下去,然后用到了数位拆分。到这未知我们的思路都很清晰,但是到了下面我就有一点点蒙了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VuGgW9qz-1647601806546)(https://cdn.jsdelivr.net/gh/yanghuanh1314/MyPicture@master/卡片局部代码.png)]

我把这里放大一下。假设让n=2001 对他的数位拆分是1 0 0 2 以我现在看来可以把拆分的数字当成角标,哦对刚才我动了一下代码,i----i 是没有任何区别的 while是个顺序循环,依次执行a[1]-- a[0]-- a[0]-- a[2]-- ,拿出一个举例a[2]-- 等价于2021-- 就这样一次循环下去。直到a[t]<0 到这里我一直有两个问题

Q1:为什么有一张卡片没了就不能拼了。那还有别的卡片也可以拼成数字啊

Q2:为什么是i-1

我现在明白了,第一个问题,问最多可以拼出多少个数字,题目中给了一个试例30张卡片拼到10后面就拼不出来了。看1 10 11需要4个1,可只有3个1。

第二个问题,其实打印输出一下

卡片题代码讲解

因为是if(a[t]<0) 拼到3181则a[t]==0 拼到3182则a[t]<03182是拼不出来的。所以3182-1。

然后我试了一下,如果让if(a[t]==0)

卡片代码

这道题还有个思路,1 肯定是先被用完的。只需要枚举1出现的次数

xxx

如果是1,那么就计数,当ans==2021。输出i。不用-1.

这道题一开始感觉很难,这么一写,感觉我悟了。枚举每一个数字,拆分、计数、

试题3:跑步锻炼

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aUIVruI2-1647601806547)(https://cdn.jsdelivr.net/gh/yanghuanh1314/MyPicture@master/跑步锻炼代码.png)]

这也是一道蓝桥杯的题

什么意思呢,就说跑步,从2000年到2020年一直在跑步,星期一或者每月一号多跑一公里,问这20年一共跑了多少。

一开始我没有想出来,看了一些题解。现在我明白了,因为我写出来了。

纯暴力纯枚举,先枚举每一年,在枚举每一月,之后是每天。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZQyqVoF4-1647601806548)(https://cdn.jsdelivr.net/gh/yanghuanh1314/MyPicture@master/【跑步锻炼】代码分解.png)]

三层循环。然后接着看里面的语句。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4OuWr4DM-1647601806548)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220318100338779.png)]

ans 用来计算结果,mon 星期。第一个if语句if(mon==8) mon=1 ,这星期结束了。下一个星期一也可以是星期八,就需要判断一下如果是星期八时,当他变成星期一。我改动了一点点,其实这里还可以写成了另外两种形式if(mon==7) mon=0if(mon%7==0) mon=0 他都是在传达一个意思,mon=7 则下一次mon=1因为星期七(日)后面不可能是星期八,要转换一下。

然后判断是星期一还是月一号,因为要多跑一公里。

下面还有个if是什么意思呢,在最外层的循环,循环下来是包含2020这一整年的,而他只是跑到了2020年的十月一号。

mon++用来计算出明天是星期几

这么分析下来,这道题就变得简单了。

试题四:校门外的树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z3HM89bd-1647601806548)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220318150457909.png)]

题目的意思是有一条马路上种着树,现在要建地铁站,建地铁站的话这些树木就要被移除,问你剪完地铁站后还有多少棵树。

校门口的树

这是洛谷上的一道题,一开始我也是看着题解写出来的,也是说是用到了暴力枚举把,

第一个循环先模拟树的状态,10 无。为什么是l+1 棵树呢?0的位置也有一棵树。

第二个循环是要砍去这个范围的树,我设看去的树为0.

第三个循环不了了之,那就是统计这个数组还有多少个1。

试题五:爱与愁的心痛

爱与愁的心痛

【爱与愁的心痛】代码

代码分析,其实就说中间部分的循环我是想着一个晚上都没有,求助了csdn,还是看题解做出了的。

我假设刺痛值是:A B C D E F G

我是怎么理解着呢,我把连续理解错了,我的理解是三个为一组求值,输出最小值。

其实是这样的:ABC BCD CDE DEF EFG

sum+=a[i+j] 是怎么来着

爱与愁的心痛讲解

因为要求连续m个数字,就和这个图演示的一样。对,当时给我说了我就慢慢着这么出来的了。

n-m+1 应该是按着规律是可以找出来的

然后下面是一个排序,一开始我用的是冒泡排序

小总结

通过这五道题我对枚举又有一个深度。那就是枚举不只是用于数字,还有数组,试题四和五就是对数组枚举但无论如何都需要判断。

还有个时间的问题O(n) 时间复杂度,就是说有可能会爆,但我对这方面不是很了解,算法还没入门。哈哈哈。我通常会写完程序跑出来后看看有没有可以减少没必要的循环。减少一丁点时间。

4,感想

就不写总结了,感想

刷了一个月的题,目前了解到的就说枚举。

然后刷题很慢,也很难受。四个字:怀疑人生。

好了,到这里就结束了。如果有错误的地方请指正,因为我也是正在学习,如果我帮到了您,是我的荣幸。

谢谢大家。

n)` 时间复杂度,就是说有可能会爆,但我对这方面不是很了解,算法还没入门。哈哈哈。我通常会写完程序跑出来后看看有没有可以减少没必要的循环。减少一丁点时间。

4,感想

就不写总结了,感想

刷了一个月的题,目前了解到的就说枚举。

然后刷题很慢,也很难受。四个字:怀疑人生。

好了,到这里就结束了。如果有错误的地方请指正,因为我也是正在学习,如果我帮到了您,是我的荣幸。

谢谢大家。

  • 12
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值