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\n",ugly[n]); 25 } 26 }
小结:其实预处理是后写的,开始写到里面了,预处理显然要更快一点,时间复杂度O(n)。