链接:https://www.hackerrank.com/contests/codeknight-1/challenges
这些题好蛋疼啊。。。。
Magical Cards:给你一个整数$n$,问你有多少种拆分方法,将这个数拆成素数的乘积。
首先将这个数分解质因数,并记下每个素因数的个数$c[i]$以及一共有多少个素因数$tot$,问题转化成将这$tot$个素因数有多少种排列方式了。直接考虑每一类素因数$p[i]$要在$tot$个位置中占据$c[i]$个位置,每一种素因数的排放实际上是相互独立的。则位置有$C_{tot}^{p[i]}$种,剩下$tot-p[i]$个空位下一个质因数再放就行。
1 |
|
Shubham and Subarrays:给你n个数,和一个整数k。让你求有多少个子区间的乘积为k。
考虑这样的区间问题首先想到尺取,但是仅尺取还不够。考虑k=1的情况,假如有连续的1存在(如:1 1 1 1),那么实际上有6种($\frac{3×(3+1)}{2}$)。特殊处理掉这个情况,剩下的再计算乘积恰好为k时,左右两个指针外部的1的贡献就行了。
1 |
|
Chef and Cakes:这题太水,不多说了。
1 |
|
Domino’s:n个多米诺骨牌,每个骨牌的位置为$x_i$,高度为$h_i$,每个骨牌向右倒下能砸到$[x+1,x+h-1]$范围的骨牌。现在让你统计每一个骨牌从它的位置向右倒下后能砸倒多少骨牌(多米诺骨牌后面的骨牌被砸倒还会影响到后面的)。
我们给n个多米诺骨牌按$x_i$排序后发现,由于最右边的骨牌倒下的影响只有自己,即为1,于是我们考虑从右往左开始处理:设我们骨牌的结果为$dp_i$,每当处理到第$i$个骨牌时,我们单张骨牌砸中的范围为$[x_i+1,x_i+h_i-1]$,我们对再它右边的骨牌中找到能砸中骨牌最多的那张牌即可(当然这里也有递推关系)。使用线段树维护每一个骨牌的dp值,每次查询的时候首先二分$[x_i+1,x_i+h_i-1]$(即受到当前骨牌影响的骨牌)中的下标$aim$,然后在线段树上查询$[pos+1, aim]$内dp值最大的下标id$,对于每一个骨牌$i$,答案为这个骨牌右边的dp值+这个骨牌左边至$i$骨牌中的骨牌数量$id-pos-1+dp$。
1 |
|