USACO官方解法:为了实现起来更简单,咱们把1也做为一个丑数。当咱们已知前k个丑数,想获得k+1个,能够这样作:对于每一个质数p 寻找最小的丑数h使得h*p比上一个丑数大取咱们找到的h*p中最小的一个:它就是下一个丑数为了使搜索更快,咱们能够为每一个质数维护一个索引"pindex”表示每一个质数已经乘到了哪一个丑数,每次都从那里开始,而不是再从头再来。ios
/* ID:jzzlee1 PROB:humble LANG:C++ */ //#include<iostream> #include<fstream> #include<string> #include<algorithm> #include<cstdio> using namespace std; ifstream cin("humble.in"); ofstream cout("humble.out"); long chou[100010];int p[110],pa[110]; int main() { int i,k,n,num=1; cin>>k>>n; for(i=0;i<k;i++) cin>>p[i]; chou[0]=1; while(num!=n+1) { long long min=0x7FFFFFFF; int m=-1; for(i=0; i<k; i++) { while((long long)p[i] * chou[pa[i]] <= chou[num-1]) pa[i]++; if((long long)p[i] * chou[pa[i]] < min) { min = p[i] * chou[pa[i]]; m = i; } } chou[num++] = min; pa[m]++; } cout<<chou[n]<<endl; return 0; }