Ugly Numbers

Ugly Numbers poj-1338

    题目大意:让你求这个序列的第n个数。这个数列满足:每一个数的因子只有2,3,5,而且第一项是一,且逐个递增。

    注释:n<=1500

      想法:开始的想法很简单,也很容易想到,就是弄一个队列,这个队列里面每一个数对于答案都是有贡献的,换句话说队列中的任意一个数queue[i],queue[i]*(2,3,5)对于答案来讲都有可能直接更新,这样的话,维护队列的头指针和尾指针,或者直接上STL。

        而还有一种想法就是维护三个指针(汗~),t2,t3,t5,分别表示乘上2,3,5所恰好能更新答案的位置,即:ugly[ti]*i>x[松弛变量],且ugly[ti-1]*i<=x[松弛变量]。这样的话,题目就变的简单,一道挺水的模拟... ...想不到别的分类了。

    最后,附上丑陋的代码... ...

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 int ugly[2000]; 
 5 int main()
 6 {
 7     ugly[1]=1;
 8     ugly[2]=2;
 9     int t5,t2,t3;
10     t5=t3=1;
11     t2=2;
12     for(int i=3;i<=1500;i++)
13     {
14         ugly[i]=min(min(ugly[t2]*2,ugly[t3]*3),ugly[t5]*5);
15         if(ugly[t2]*2==ugly[i]) t2++;
16         if(ugly[t3]*3==ugly[i]) t3++;
17         if(ugly[t5]*5==ugly[i]) t5++;
18     }
19     int n;
20     while(1)
21     {
22         scanf("%d",&n);
23         if(!n) return 0;
24         printf("%d
",ugly[n]);
25     }
26 }

    小结:其实预处理是后写的,开始写到里面了,预处理显然要更快一点,时间复杂度O(n)。

原文地址:https://www.cnblogs.com/ShuraK/p/8424337.html