USACO3.1 Humble Numbers(humble)

        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;
}
相關文章
相關標籤/搜索