TOP
今天比赛特别困,要吐槽一下纪中的空调,真的太TM 冷了!(弄得一晚上睡不好){{{(>_<)}}}
T1(铁轨)
赛时:
一看到题目就知道是个栈,淼的一逼,很快就切了。结果吧while打成了if,狠心爆零_(:зゝ∠)_
正解:
同本人想的一模一样,直接模拟栈就好了。能够按照序列输出就“Yes”否则就输出“No”
T2(独立集)
赛时:
第一眼一脸懵逼,再看一眼二连懵逼,于是看了about 15 mins才理解了题意。
觉得是和树有关的算法(应该是DP),可惜本人过于蒟蒻,没打出来(。・・)ノ
正解:
树形DP,对于每个节点,设f[i,0]表示节点以i为根(不选节点i)的子树的最大独立集个数。
f[i,1]表示节点以i为根(选上节点i)的子树的最大独立集个数。
因为f[i,0]是不选,所以它儿子j可选可不选,就能得到 f[i,0]:=f[i,0*](f[j,0]+f[j,1]);
同样f[i,1]是选择,所以它儿子j必须不能选,也能得到 f[i,1]:=f[i,1]*f[j,0];
最后输出 f[1,1]+f[1,0] 就行了。
T3(石子游戏)
赛时:
看起来很简单,实际上 真的(nan)很(de)简(yi)单(pi)!应该是找规律什么的,
但是找了将近 1h 也没找出来,想着骗点分,结果一份也没有骗到 (;′⌒`)
正解:
貌似是博弈论,呵呵,我这方面贼差的(方法策略类)。题解实现简单,理解很难,问了好几个人才懂。
K=1的情况:必败结果都是2^i
K=2的情况:必败结果为斐波那契数列。
(P.S.:斐波那契数列性质:把任意一个数N分解成数列中的数相加,分解出的数至少相差2倍以上(注意是以上))
K>2的情况:
根据上面的两种情况,我们可以发现:当K不同时,只是分解出的数列不同,计算是一样的。
那么我们只要算出一个序列,用这个序列的数相加来表示N,并且每两个数都要相差K倍以上。
但是考虑到时间可能会爆,所以设当前K计算出的序列为A,则用B[i]表示从1~i序列中能构成的最大数。
显然A[i]=B[i-1]+1(A[1]=1 且 B[1]=1)
之后计算B[i],找到一个最大的j,且A[j]*k<A[i]
因为当前的B[i]等于最大且和当前项的倍数不超过K的数所能构成的最大数,
再加上当前数,所以B[i]=B[j]+A[i]。
之后把N一直往下减,减到N=当前项,答案就是当前位置对应的数。
ALL IN ALL
这套考试还是很糟糕,希望下次继续努力!!!