USACO3.1 Humble Numbers(humble)

        USACO官方解法:为了实现起来更简单,我们把1也作为一个丑数。当我们已知前k个丑数,想得到k+1个,可以这样做:对于每个质数p 寻找最小的丑数h使得h*p比上一个丑数大取我们找到的h*p中最小的一个:它就是下一个丑数为了使搜索更快,我们可以为每个质数维护一个索引"pindex”表示每个质数已经乘到了哪个丑数,每次都从那里开始,而不是再从头再来。

 

/*
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;
}

你可能感兴趣的:(USACO)