T1:
是一道很水的栈的题目。
因为车子到了车站就只能往b处走了。所以当车子进了车站后,首先要判断是否应该开往B处,如果这个时候开往B处恰好符合题目给的顺序,而你没有开,则一定会错。
T2:树形DP.
f[i,0]表示第i个节点不选的最优值。
f[i,1]表示第i个节点选的最优值。
状态就自己推推吧。
然后,DP的时候需从上往下,然后在弹栈的时候赋值,方可处理无向图的神经质。
还有就是要用边集数组,那些用邻接矩阵水过得。。。。。
T3:这一题,博弈题。经典。
分类讨论.
当k=1时:
因为题目规定当前选数的人不能超过第一个人选的数。
则我们把n转化成二进制后,第一个人每次取二进制最末尾的‘1’。第二个不可能取超过这位数的‘1’。则第二个人只能取‘0’。也就是永远取不了‘1’,那么不管有多少个‘1’或‘0’,最终都是第一个人获胜。
而第一个人不能获胜就是当n是2的次方时,第一个人不能取最末尾的‘1’,则只能取0,那么第二个是就可以必赢了。
当k=2时:
很明显,这也可以运用k=1时的第二个人“不可能取更高位”的思想,来构造一个所谓的必赢序列。
亦即,我们只要构造一个‘0’‘1’组成的序列,使得每一个‘1’互不相邻,则可以必赢。
那么,斐波那契数列则恰好可以符合其标准。
任意一大于0的自然数可以表示为斐波那契数列里的数,且两两之间的倍数之差一定大于2.
例当n=12:
斐波那契: 8 5 3 2 1
则可以表示为:1 0 1 0 1
第一个人取末尾的1,那么n=11,则第二个人不管取多少,都不能取末尾的两位以上的1,余下的数一定可以又表示为一个所谓的斐波那契,当第一个人取最后一个‘1’时,则第二个人又取不了1.
以此类推,可得知第一个人必胜。
当第一个人取最后一个‘1’是唯一一个‘1’时,这种情况是有可能发生的,但一旦发生这种情况,则可以证明第一个人一定可以一次性把剩下的数全部取完。
而当n本身是斐波那契数列里的一个数时,因为第一个人不可以第一次就一次性把所有的数取完,则不可以表示为所谓的斐波那契状,必输。
另外需要注意,这里一定要理解构造斐波那契时一定要从能减的最大的那个数开始减下去。这对之后k>2是有一个过渡作用的。
当k>2时:
其思想与k<=2是一样,只是我们需要构造一个序列,使得这个序列每一项的差大于k。而后运用k<=2的思想求解答案的正确性。
那么怎么构造这个所谓的必胜序列呢?
很明显,当n<=k+1时,是没有必要做下去的。
当n>k+1时,
我们用一个ai表示这个序列的第i项,bi表示a[1~i]中能构成的符合“标准”(差为k倍的)最大值。
显然——ai=bi-1+1;
那么bi怎么求呢?
我们只需找一个与比ai小k倍以上中最大的那个对应的下标t。bt再加上当前ai则肯定为bi的值!
最后,怎么判断正确性就不用讲了吧,留一点想象的空间自行脑补吧。