1, 前言
记录一下叭,好久没有更新了。其实也在一直写博客、刷题,没有发,也没有写完。
最近在刷题,刚刚开始刷题,为了应对比赛。
先看这三张图叭,截止到目前刷了这多。这些不算多,但我已经尽力了。。。哈哈
刷题刷了这么多,有些地方还是不懂,但是还是悟出了一些道理。
这篇记录我想围绕暴力枚举来说一说我的一些见解。可能也有一些错误,大家多多指正。
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。
第二个问题,其实打印输出一下
![卡片题代码讲解](https://cdn.jsdelivr.net/gh/yanghuanh1314/MyPicture@master/卡片题代码讲解.png)
因为是if(a[t]<0)
拼到3181则a[t]==0
拼到3182则a[t]<0
3182是拼不出来的。所以3182-1。
然后我试了一下,如果让if(a[t]==0)
呢
![卡片代码](https://cdn.jsdelivr.net/gh/yanghuanh1314/MyPicture@master/卡片代码.png)
这道题还有个思路,1
肯定是先被用完的。只需要枚举1
出现的次数
如果是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=0
、if(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)]
题目的意思是有一条马路上种着树,现在要建地铁站,建地铁站的话这些树木就要被移除,问你剪完地铁站后还有多少棵树。
这是洛谷上的一道题,一开始我也是看着题解写出来的,也是说是用到了暴力枚举把,
第一个循环先模拟树的状态,1
有 0
无。为什么是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,感想
就不写总结了,感想
刷了一个月的题,目前了解到的就说枚举。
然后刷题很慢,也很难受。四个字:怀疑人生。
好了,到这里就结束了。如果有错误的地方请指正,因为我也是正在学习,如果我帮到了您,是我的荣幸。
谢谢大家。