初中OJ2105【NOIP2016普及组复赛】魔法阵

这是这次NOIP比赛中的第四题,感觉有些难度。


题目大意:

有四个数A、B、C、D,满足以下条件:

①A

②(B-A)=2(D-C)

③3(B-A)<(C-B)


先说说80分的方法。

设CD之间的距离为i,则AB为2i,BC为6i+k (k>0)

初中OJ2105【NOIP2016普及组复赛】魔法阵_第1张图片

所以,我们可以先把同一数值的数用一个数组存个数,然后枚举i、A和C。

重点是如何统计方案数。

设Wi表示数值为i的数出现次数。

则根据排列组合可以得知,A的次数就是Wb*Wc*Wd。

B就是Wa*Wc*Wd。

以此类推。


最后把每个数所对应的数组输出,就可以拿到80分。



(看懂了80分再看100分)



100分:

尝试把三重降到两重。

根据上面可以得知,我们其实只要枚举一个A和i,接下来把所有符合条件的CD求出计算。

初中OJ2105【NOIP2016普及组复赛】魔法阵_第2张图片

可以用后缀和来实现这一想法。

设SUM[i]表示从i~n-i之间所有的CD对的乘积。

因为A和B是已知的,而CD却是不定的,所以先用后缀和求出A和B的方案数。

初中OJ2105【NOIP2016普及组复赛】魔法阵_第3张图片

为了求出最多的方案数,假设k=1。

因为AB为2i,BC至少为6i+1,所以C至少为A+8i+1。

接下来再把之前的公式合并一下,就变成了这样:

方案数A=Wb*Sum[A+i*8+1](所有的Wc*所有的Wd)

初中OJ2105【NOIP2016普及组复赛】魔法阵_第4张图片

同理,方案数B和方案A近似,只不过Wb要变成Wa。

接下来求CD的方案。

把刚才的方法改一下,用前缀和计算出所有的AB对的乘积,再枚举C的位置(D的话改一下也可以)

只不过A和B的距离为2i,所以计算前缀和时要这样算:

Sum[j]=Sum[j-1]+W[j]*W[j-2*I]

BC间隔至少为6i+1,所以B最大为C-6i-1。

初中OJ2105【NOIP2016普及组复赛】魔法阵_第5张图片

所以C的方案数就是Wd*Sum[C-6*i-1](所有的Wa*所有的Wb)

D就不用讲了吧。

最后把每个A[i]对应的次数输出就行了。

你可能感兴趣的:(OJ题解)