第九届蓝桥杯国赛参赛心得

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Kurozaki_Kun/article/details/80488999

ps:这是我第一次参加蓝桥杯的国赛,非专门玩ACM的,也很少去彻底钻研很高深的算法

        我参加的是C/C++大学B组,客观来说题目从题难度不高,总共6道,我估计自己做出了4.5道,最后拿的是国二,没有一等奖有点遗憾,不过归根结底还是自己水平还不够吧。简单说下国赛的题目内容吧。

        第一题签到题,大概意思是用面额为1,2,5的钞票换取200的金额,并且有约束条件“面额为2的张数恰好为1的10倍”,三种钞票必须有(任何一种数量不得为0),问兑换最少的钞票数量是多少。这其实是一道数学问题,即使不借助编程或其他工具也能用数学知识求解,而且我求出的解也只有一个,那肯定就是答案了,没啥特别高深的技巧。

        第二题讲的是有n盏灯,任意相邻的两盏灯不得同时打开,问n盏灯的亮法有多少种组合。这题我观察了一下就找到了规律,n=2有3种,00(相邻可以同时灭,但不能同时亮),01,10,n=3有5种,000,001,010,100,101,n=4有8种,一直下去其实是一个斐波那契数列。或者也可以用DP的思想推出这个规律,当第n盏亮时,n-1一定不能量,那么有两盏灯的情况已经确定了,此时f(n) = f(n-2)。当第n栈灯不亮时,有f(n) = f(n-1),两种情况加起来就是f(n) = f(n-1) + f(n-2)了,显然这就是斐波那契数列的递推公式。

        第三题代码填空题,填的是格雷码生成的算法,然后最核心的一句就是“找到格雷码最右边的1,并对其左边的1位取反”。也就是找1001,1010,1100中红色的那个1在第几位。通常会想到用循环+移位来找,可这是代码填空题,只能填a = ________; 横线的部分,显然出题者的目的不想让我们使用循环。我觉得这题非常有趣,因为解题思路很巧妙,将原来的二进制按位取反,再+1,结果与原来的二进制按位与,就能得到除了最右边第一个1对应的位为1,其余位0的二进制码,再左移就能够得到想要找的位,也就是a =((((~a)+1)&a)<<1)^a这样的答案。至于为什么,注意一下取反+1,是不是觉得似曾相识?没错就是对负数求补码的时候的做法!还记得对负数求补码的另一种方法吗?找到右边的第一个1,将左边的位全部取反,二者的异曲同工之处就在这里,如果理解了求补码的原理,这个答案也就很好理解了。

        第四题是最简单的一道编程题了,简单来说就是给定n和k,对于任意x(0 <= x < n),能够不断+1或+k,使得结果为最接近的一个n的整数倍,当然x为0时就不用做任何操作了,为x最坏的情况下最多多少步操作就可以达到目的。这道题DP一下应该没问题,对于n-k<x<n,当然是只可以+1,因为+k肯定超过n了,对于0<x<n-k,可以+1或+k,即f(x) =min{ f(x-1), f(x-k)} +1,递推公式很明显了。

        第五道题我没做出来,虽然我有思路,感觉是用DP,但是后面测试数据总是不对,应该是我自己没能找出代码上的问题。

        第六题是求矩阵元素的总和,第i行j列的元素是gcd(i, j)的平方,我用了还是比较暴力的计算总和,应该只能过30%的数据,因为后面矩阵很大。我认为这个矩阵每一列的总和都有一个规律(或者说一个公式)能够简便计算出来,但我想了很久没找到。第一行和第一列的元素必定为1,因为1和任何数的最大公倍数必定为1,对角线上的元素必定是1,4,9,16….因为同一个数的最大公倍数就是其本身了,而且这是一个对称方阵,只需要计算对角线一边的三角形的元素再*2就可以了,我想每一列总和可能还会有规律,不用对每一个位置都算最小公倍数,但是我想了很久没找出来,也可能是我一开始的出发点就不对吧…


总结

1、对于算法来说数学永远是不可缺少的一部分,尤其是找规律和数论这一块,ACM其实也非常喜欢考这一方面,我数论这块比较弱,毕竟我们没有专门开数论的课程,只是在密码学这门课上大概了解了一些概念。

2、不要小看斐波那契数列,有许多题目喜欢考的,但是很多时候它的规律不容易被看出来,毕竟容易看出来是斐波那契就太没意思了,我之前刷过一些编程题遇到有四五道都和斐波那契数列有关的

3、这次比赛用到了DP(动态规划),DP是我认为五大经典算法中最难掌握的了,不是因为它理解起来有多难,而是关于DP的问题变化多种多样,例如最经典的01背包求最优解,又例如第二题求所有组合情况的数量,还有很多很多

4、要真正学好算法还是需要蛮多投入的,就像学数学一样,算法不是说看下书理解下概念就能学会的,理解之后还要练,说白了就是刷题,不刷题永远不知道你学过的算法能用在哪些地方

5、第三题的格雷码程序填空我觉得出的挺有意思的,因为它的思路回到了计算机最基础的部分——补码


其他

        第一次参加国赛,第一次出广东省,第一次到北京,除了比赛还去参观了一些景点什么的,去天安门和故宫转了一圈,进去清华大学感受了一下里面的气息,倒数第二天花了一下午逛颐和园,在佛香阁上见到了非常不错的景色,天坛去的有点晚,祈年殿已经关门了有点可惜,晚上去了鸟巢和水立方。就是在北京消费对我这个长期在二线城市生活的人来说有点高,尤其是二环那一带...

猜你喜欢

转载自blog.csdn.net/Kurozaki_Kun/article/details/80488999