第九届蓝桥杯题解+分析

//自己233的回顾一下菜鸡之路。


第一题答案 125

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

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

//第一题就凉了:),第一个没想到直接用电脑自带日历检查一遍,第二点记错了,以为是能被4整除&&不能被400整除。

第九届蓝桥杯题解+分析_第1张图片


第二题:387420489

要填数字,题目中有说,答案是9^9

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

//不记得题目了...反正答案挺大的


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

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

//这题应该是复数那题,复数公式我不记得了,这题没做

设z1=a+bi,z2=c+di(a、b、c、d∈R)是任意两个复数,那么它们的积(a+bi)(c+di)=(ac-bd)+(bc+ad)i.
  其实就是把两个复数相乘,类似两个多项式相乘,展开得:ac+adi+bci+bdi^2,因为i^2=-1,所以结果是(ac-bd)+(bc+ad)i .两个复数的积仍然是一个复数.


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

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

//OMG我当时真的没想那么难...我不记得我填多少了,好像是9?


第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]
注意到每个数字范围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就行了

//这题就是不知道能不能hold住大数了

第8题:



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

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

//暴力做的,但我的复杂度是n的3次方...我的妈...


第9题:

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

# # 

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

//没有用广搜:),我还奇怪为什么没有dfs,只是用了check上下左右,但是我没考虑岛屿相连的情况啊啊啊啊

//而且还因为不懂如何把String读到的转换成char[]痛苦了一阵,又找不到api文档在哪..

String转换为char

在Java中将String转换为char是非常简单的。
1. 使用String.charAt(index)(返回值为char)可以得到String中某一指定位置的char。
2. 使用String.toCharArray()(返回值为char[])可以得到将包含整个String的char数组。这样我们就能够使用从0开始的位置索引来访问string中的任意位置的元素。

https://blog.csdn.net/yaokai_assultmaster/article/details/52082763


第10题

//最后一题题目看都没看。

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

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

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

如果最后为负数就说明你要调整一下,也就是少乘一个负数多乘一个正数,或者少乘一个正数多乘一个负数,这个时候你只要比一下哪个更大就应该ok!


//本文链接在https://blog.csdn.net/vampirekalus/article/details/79779929这里。

总结一下。

1.眼高手低,简单题做少了,但是转方向那题发挥还可以,算快做出来的。

2.时间复杂度!不会看!我的天哪,我现在严重怀疑交的很多题都超时了,有一些提到大数的,我都没有想到不用暴力的方法去做(不过想这个过程更花时间吧)

3.dp&dfs还是要继续练...很多其他题型不知道不会做硬刚

4.不会利用电脑上的简单功能,不会看api文档...这个是真要命,因为比赛电脑都是英文版的

5.不应该带吃的,根本没时间:),而且也完全不饿啊

6.lzy那种去年做九题错两题拿省一去参加国家级的巨佬都凌晨四点睡(去年和我现在一样,也是在acmore做了四五十题(其实也就是把蓝桥杯能做的基本的都做了),今年就做了七题?),今年一年没练都能做九题错三题,最后一题不会提前一小时出场。我这么早睡真是不要脸。

你可能感兴趣的:(2018.3,蓝桥杯)