随笔分类 - NOI简记
最近在学习C++,在NOI上做一些题目,发现还有很多不足的地方,尤其是识海中洞比较多……需要打一些补丁
摘要:这是在NOI上看到的一个问题。题目是这样的: 这个问题前面一篇提到过,如果要找一个解用回溯就可以,如果要找最优解用BFS算法就可以了。不过这里有一点变化,如果是迷宫求最短路径那就直接四向入队就可以。但这个不是最短路径,是最少转折。所以算法上有一定的区别。让我们来分析一下怎么用最少转折来描述这个问题:
阅读全文
摘要:这是一个关于格式化输出目录结构的问题,感觉这类问题用堆栈做更顺手,不过题目在递归里面,那就用递归做。 在编码的时候,一直用的是string类,所以长度不超过30什么的就呵呵了。解码的思路就是遇到“]”的时候返回上级,遇到"d"开头(目录)的时候进入下级,遇到文件就在当前级。所以构建一个目录结构: 这
阅读全文
摘要:这个问题交了好几次,漏打了一个按址传递,漏了一种情况。简要分析一下,这个题的要点就是: 1、小数点对齐 2、结尾0的处理 结尾0的处理这里开始漏了一种情况,只考虑了小数点之后的不要了,小数点之前的占位0没考虑。例如:1.2+8.8这样。小数点对齐倒是没什么问题,但是处理整数部分对齐的时候忘了一个&,
阅读全文
摘要:这个问题是说给定一定数量(最多24根)的火柴棒,用全部这些火柴棒组成一个A+B=C的算式,其中每个数字拼法如下: 而加号和等号均为2根火柴。 这个问题题意没有明确说明负号问题,但从出题者传递的“意境”来看,其中A,B,C均大于等于0。 第一眼看到这个问题的时候就在想,是不是要把火柴棍数目-4然后看能
阅读全文
摘要:做了一个NOI上面的问题,叫blah集合,以a为基数,则2x+1和3x+1都在集合中,且集合中全部元素都由此计算得来。a∈[1,50],问升序排列后第n(n∈[1,1000000])个元素是多少。以输入示例a=1,n=100,b[n]=418为例: 依次计算时会发现每1个数据会变为2个,这些数又会发
阅读全文
摘要:哈希表即散列表,用于存储key-value对,key作用和数组下标相似,只是其key是经过一定加工(hashfunction)之后得出的。其目的主要是加速查找,也可以认为以散列函数的时间消耗换取了对数组空间的紧缩。一般说来,设计一个合理的散列函数是关键——好的散列函数可以使得存储空间被充分利用,亦即
阅读全文
摘要:约瑟夫问题的递推公式是f[1]=0,f[i]=(f[i-1]+m)mod i。不过是一个“数据结构之指针和链表”里面的问题,所以还是先用链表和指针解决。因为要移除中间元素,所以需要一个双向链表,这里用一个数组来模拟: 1、构建结构和数组: 2、初始化数组元素的id: 3、初始化数组元素的指针: 4、
阅读全文
摘要:先看两个示例: 这两个数组一个宽度是5,一个宽度是4。以左图为例如果要在数组里面蛇形输出,从1开始x递增,到达5时改为y递增,到达9时x递减,13时y递减(注意此时的miny)完成一圈进入内圈。这样就可以在数组里面输出这些数字。在NOI上做了一个小兔子捡金币的问题,如果在M*M的矩阵内,每个点有一个
阅读全文
摘要:这个问题在算法效率一节里面,是这样的: 如果把数据规模都缩小一下,那就是神奇的口袋1,在解这两个问题的时候,想了几种方法,其中最慢的一种就是遍历每种情况——对每一个都实行:取或不取: 这解决小规模数据的问题是可以用的一种直观做法。当然,也可以用动态规划。用动态规划时我们要考虑的就是:取当前数字时,能
阅读全文
摘要:这个问题我做了不少尝试,而最后使用的方法是BFS。开始尝试了带有启发和剪枝的DFS,带有重复路径检测贪心等一些思路,但是都超时了。思考了一下,主要问题在于这些算法对没有任何阻挡(或极少阻挡)的情况不够适应,当然,进一步改进采用多种算法结合的方式还是可以解决问题的,而后测试了B*的思路,能够完成题目。
阅读全文
摘要:做了一段时间NOI,做到动态规划看了几天算法书籍。还是没有深入,学了基本的动态规划,稍有一点体会,记录到这里。 背包是这样一类问题:在限定总质量前提下,从若干质量\价格对中,取哪些能使得价格最大。 动态规划是一种思想,简单的说,动态规划思想就是充分利用对子问题的计算结果来递推父问题结果。所以,动态规
阅读全文
摘要:解:设:a=k1*x+r;b=k2*x+r;c=k3*x+r,消去r: a-b=(k1-k2)*x b-c=(k2-k3)*x a-c=(k1-k3)*x 现在有3个数n1,n2,n3求它们的最小公约数。可以继续把它们互相做减法,得到一系列数m1,m2,m3……集合n中的数和m中的数都能被最小公倍数
阅读全文
摘要:今天上午完成了“迷宫”问题,也思考了“2.5基本算法之搜索”的另外几个问题:小游戏(就一连连看),马走日,红与黑等。我所关注的这几个问题都可以用回溯算法来进行解决。回溯算法简单说就是当运行到叶子节点证明不是解时回到上一层节点继续遍历,如此循环直到找到一个解;如果需要全部解,可以继续遍历,如果不需要可
阅读全文
摘要:论出于什么原因和目的,学习C++已经有一个星期左右,从开始就在做NOI的题目,到现在也没有正式的看《Primer C++》,不过还是受益良多,毕竟C++是一种”低级的高级语言“,而且NOI上的题目可以说是循序渐进。不仅仅是从ASM、VB.NET的角度看编程语言,这让我对编程语言语言的理解有了一些深入
阅读全文
摘要:分治是一种思想,一种解决问题的方法、手段。从理论上理解起来并不困难:就是把一个大问题分解为若干小问题,逐一解决这些小问题,而后汇总结果。分治思想来指导的算法,都会满足这样的要求: 1、如果问题能分解为子问题,并且子问题和原问题可以用同一种方法解决。当然,如果子问题还比较复杂,那么可以继续分解。 2、
阅读全文
摘要:一、递推: 所谓递推,简单理解就是推导数列的通项公式。先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 这个问题可以用递归来进行解决,但是解题时间1秒明显不够用。怎么办呢,可以考虑找到“规律”,然后推导公式解决问题,开始画图分析: 这是4个台阶时的全部7种走法,记作f(4)=7。现在
阅读全文
摘要:二分法的基本思路是对一个有序序列(递增递减都可以)查找时,测试一个中间下标处的值,若值比期待值小,则在更大的一侧进行查找(反之亦然),查找时再次二分。这比顺序访问要少很多访问量,效率很高。 设:low,hight,mid均为整型。以在一个降序arr[5]={5,4,2,1,0}中查找k=4时的下标为
阅读全文

浙公网安备 33010602011771号