2016.12.03【初中部 NOIP提高C组】模拟赛题解

来源:互联网 发布:python unpack修饰符 编辑:程序博客网 时间:2024/05/29 10:10

很久没有写题解了,都是改不完题目或者没时间,不像别的神犇当天就可以写完题解了。


T1:

题目大意:有个n*m的一个矩阵,0 为水; 1 为荷叶; 2 为岩石; 3 为于大夫开始的位置; 4 为于大夫要去的目标位置。目前不能到达目的地,在放置最少的莲花前提下,最少几步能走到目的地。

           一看题,就知道是搜索。n,m≤100。

           30分:

可以用深索,枚举当前当前走到的这个位置放不放荷花,并且递归下一步走到什么方向。显然,时间复杂度很高。

           100分:

 深搜效率慢,可以考虑广搜,刚搜到的必定是最小答案。但是如果为广搜,他搜索的定是最小的步数而非莲花数。所以我们的标记应更改为:到此处的最少莲花数,在这个前提下,才进行最小步数的搜索。时间复杂度可观。

T2:

题目大意:夏令营有N个人,每个人的力气为M(i)。请大家从这N个人中选出若干人,求这些人可以分成两组且两组力气之和完全相等的方案数。

           显然,这个是一个搜索的题目。如果说选N个人就简单一点,但是若干个就香菇了。。。

           50分:

                因为我们他可以选若干个,所以我们就枚举选多少个人 ,递归即可。时间复杂度(20*3^20)

           网上说有3^20次方,应该是不可能的,有重复情况很难处理。

           100分:

                3^20次方显然超时,所以我们可以采取中途相遇法,把它分成两半进行搜索。对于每一个数,有3种情况(系数):1(放在左边等式),-1(放在右边等式),0(不选)。

                有人问,输入1 3 2 ,怎么可以搜索到1+2=3 啊?  

                1-3=-2,因为你减去了一个数,也就是系数为-1,那么移项就相当于放到另一边了。

                搜索后,用A数组存等式左边可能的和,B数组存等式右边可能的和。显然,只要a[i]=b[j]便是一种方案。但不会这么水滴!可能会有重复的情况。所以我们就状压一下它是怎么选的:

系数为1,或者-1,当前的位置标记为选。左边的状态or右边的状态就是你选的状态,标记一下即可。

a,b数组可能很大,所以需要优化来枚举。建议排序,君且随意。


T3:

0 0
原创粉丝点击