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