USACO 2.4 Humble Numbers
丑数 死搞是绝对不行的....
( 如果不停的生成 用小根堆来维护.... 可行性未知
因为太麻烦而没写.....) 那应该怎么做呢? (感谢小贺给我介绍了HQM 大牛的做法)
首先我们设一个数组 F[I] ------- 第I 个丑数 (假设Prime 数组中存了所给的质数)
显然我们是要按由小到大的顺序生成.... 并非全部生成在排序....
那么我们可以这样做.....
因为丑数的因子就为所给的质数... 那么我们可以把生成的质数不停的乘以 所给的质数 取最小的作为第I个丑数以此类推..... 那到底该乘以哪个呢? 这里我们又要开一个数组Num[I] 记录当前这个Prime[I] 所对的质数该乘以哪个已生成的丑数来构成新的丑数........ (MS 我没有讲得太清楚![]()
...但是自己清楚就好了....下面是式子....)
这个方法真的太拽了.....![]()
很巧妙的生成了当前最小丑数......
理解....消化.....运用..........![]()
![]()
![]()
( 如果不停的生成 用小根堆来维护.... 可行性未知
因为太麻烦而没写.....) 那应该怎么做呢? (感谢小贺给我介绍了HQM 大牛的做法) 首先我们设一个数组 F[I] ------- 第I 个丑数 (假设Prime 数组中存了所给的质数)
显然我们是要按由小到大的顺序生成.... 并非全部生成在排序....
那么我们可以这样做.....
因为丑数的因子就为所给的质数... 那么我们可以把生成的质数不停的乘以 所给的质数 取最小的作为第I个丑数以此类推..... 那到底该乘以哪个呢? 这里我们又要开一个数组Num[I] 记录当前这个Prime[I] 所对的质数该乘以哪个已生成的丑数来构成新的丑数........ (MS 我没有讲得太清楚

...但是自己清楚就好了....下面是式子....) F[I]=Min{Prime[K]*F[Num[K]]} 1<=K<=M (M个质数) 当选择了确定的 K 时要注意Num[K] 要往后推... (意味着这个丑数已经被Prime[K] 生成过一个新的丑数了!) 边界F[1]=1 (应该很显然把.....) Num [I] = 1 (1<=I<=N 第N 个丑数) PS 特别值得注意的是判重.... (我被这个卡了N 久.... ) |
这个方法真的太拽了.....

很巧妙的生成了当前最小丑数...... 理解....消化.....运用..........




浙公网安备 33010602011771号