第九届蓝桥杯最新题解

以下是应该正确的题解,后面大题的解法有很多,仅供参考一下。

注:文末有福利!

第一题答案 125

做法,打开电脑中的日历,数一下最方便,还不会错~~

注意2000年的2月份有29天!

第二题:387420489
要填数字,题目中有说,答案是9^9

注意负数的二进制是补码不是原码

第三题:31
思路:两种方法
①直接将所有数相乘,然后每乘一个数就把后面0全部去掉记一下,不过中间会爆long long,这个好办,每次乘完只保留后4位非0数字,例如216037就只保留6037

②正解:所有的0都一定是2*5产生的,所以将每个数拆成一堆2乘上一堆5再乘上一个数,之后统计下有多少个2和多少个5取少的那个就是答案

第四题:19
动态规划或者记忆化搜索
dp[L][R][x]表示已经知道了手机从L楼丢下去摔不爆,从R楼丢下去一定摔爆,当前还剩x部手机,最多需要多少步

答案就是dp[0][1000][3]

第5题:a, i+1, r, r-(i-l+1)

有些人可能会写成a, i+1, r, r-i,虽然能算出答案,但其实不对,因为题目要求时间复杂度要为O(N)!

第6题
题目:
给你3个序列a[], b[], c[],每个序列n个数字,求出有多少组a[i], b[j], c[k]满足a[i]<b[j]<c[k],其中n<=100000,每个元素<=100000
注意到每个数字范围0到100000
可以直接线性求出答案,即sa[x]表示第一个序列中,有多少个数字等于x,sb[],sc[]同理
那么有:
for i = 100000 → 0
sc[i] = sc[i]+sc[i+1]
sb[i] = sb[i]*sc[i+1]+sb[i+1]
sa[i] = sa[i]*sb[i+1]+sa[i+1]

最后a[0]就是答案

还有一个思路:三个数组排序,暴力b[]中的每一个数字,然后二分a[]有多少个比它小的,c[]有多少个比它大的,相乘加在一起就是答案

第7题:给你一个螺旋图,问你经过某个点要走多长的路
分成上下左右4个区域,每个区域推一下公式,复杂度O(1)

这道题写出来的应该都把图中每个点都试了一遍,别爆int就行了

第8题:
有n个事件,每个事件si, ti表示第ti个帖子在第si秒被赞了一次
问有多少个帖子满足存在一个不超过D的时间段被赞了至少k次以上
暴力每个事件
然后每个事件存一下被赞的时间点,直接排序暴力看下相邻k个赞隔得时间是否<D

看起来是n²的,但其实总共事件不超过n个,所以复杂度最坏情况下排序复杂度

第9题:
广搜一次记一下每个#属于第几个岛屿,顺便标记下每个#是否可能会被淹没
之后把所有会被淹没的#全部变成点
再看下还剩下多少个岛屿还有残存的#就行了
有人给了一组这样的数据:
### ###
#######
### ###
只有一个岛屿但是淹没后你会发现“岛屿”还会多出来一个!如下

# # 

显然这样应该输出0,而不是-1,为什么呢?因为这两个点虽然没连接,但很显然本质上它们还是一个岛屿不是么?

第10题
题目:给你n个数字,要你在里面选出刚好k个,使得乘积最大

仔细思考你会发现其实最终答案为负数只有两种情况
①k=n,这n个数都是负数并且n是奇数
②k是奇数,并且这n个数都是负数
其它情况下答案一定为正
为什么呢?一个很简单的证明就是如果你结果为负数,那么你一定可以通过少乘一个负数多乘一个正数,或者少乘一个正数多乘一个负数把答案变成正的

然后正数的情况就好办了
一个很完美的方法就是所有负数取绝对值从大到小排序,所有正数从大到小排序
然后暴力负数选多少个,中间取个最大的就行了
但是这样你肯定不能取模,因为取模就错了,然而直接乘会爆long long
熟练的话你可以写个大整数乘法,不过肯定会超时所以要FFT优化乘法
不会FFT怎么办?
还是将所有负数取绝对值从大到小排序,所有正数从大到小排序
然后一个一个取,每次都取当前最大的数
如果最后刚好为整数,那完美直接输出
如果最后为负数就说明你要调整一下,也就是少乘一个负数多乘一个正数,或者少乘一个正数多乘一个负数,这个时候你只要比一下哪个更大就应该ok!

最后,给大家推荐一个良心公众号【IT资源社】:

本公众号致力于免费分享全网最优秀的视频资源,学习资料,面试经验等,前端,PHP,JAVA,数据结构与算法,Python,大数据等等,你想要的这都有

IT资源社-QQ交流群:601357554

微信搜索公众号:ITziyuanshe 或者扫描下方二维码直接关注,

里面基本什么资料都有,基础到进阶到项目实战,如果觉得不够还可以加群跟群主要,最重要的是全部免费!


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值