现在的位置: 首页 > 综合 > 正文

POJ 1338 Ugly Number

2019年09月22日 ⁄ 综合 ⁄ 共 790字 ⁄ 字号 评论关闭

 


官方题解如下:
{
我们在数组hum中计算出前n个丑数。为了实现起来更简单,我们把1也作为一个丑数,算法也要因此略微调整一下。

当我们已知前k个丑数,想得到第k+1个,我们可以这样做:
对于每个质数p 寻找最小的丑数h 使得 h * p 比上一个丑数大 取我们找到的 h * p 中最小的一个:它就是下一个丑数

为了使搜索更快,我们可以为每个质数维护一个索引“pindex”表示每个质数已经乘到了哪个丑数(即从之前的丑数里,
要得到最小的丑数,每个质数应该开始乘的位置索引),每次都从那里开始,而不是再从头再来。
}
根据上面的分析,可以使用一个数组a作为pindex,a[j]表示质数p[j]从已求的丑数集里开始乘的索引。
初始化时,每个质数从第一个丑数h[0]开始乘。
每次求下一个丑数h[i]时,首先根据上一个丑数h[i-1],检查a[i]是否需要更新。
如果p[j]*h[a[j]]已经小于上一个丑数h[i-1]了,那么当前素数p[j]的“应该开始乘的数在丑数集h里的索引”需要增加。
最后再去最小的p[j]*h[a[j]]。

 

抱歉!评论已关闭.