3.1.3 Humble Numbers 丑数

3.1.3 Humble Numbers 丑数

时间: 1ms        内存:64M

描述:

对于一给定的素数集合 S = {p1, p2, ..., pK},
来考虑那些质因数全部属于S 的数的集合。这个集合包括,p1, p1p2, p1p1, 和 p1p2p3 (还有其它)。这是个对于一个输入的S的丑数集合。
注意:我们不认为1 是一个丑数。
你的工作是对于输入的集合S去寻找集合中的第N个丑数。longint(signed 32-bit)对于程序是足够的。

输入:

第 1 行: 二个被空间分开的整数:K 和 N , 1<= K<=100 , 1<= N<=100,000. 第 2 行: K 个被空间分开的整数:集合S的元素

输出:

单独的一行,写上对于输入的S的第N个丑数。

示例输入:

4 19
2 3 5 7

示例输出:

27

提示:

参考答案(内存最优[1192]):


#include<stdio.h>
#include<algorithm>
#include<memory.h>
using namespace std;
#define INF 2147483647
int N,K;
int num[101],humb[100001]={1,1},point[101];
int min(){
	int i,min=INF;
	for(i=0;i<N;i++)
        if(num[i]*humb[point[i]]<min) min=num[i]*humb[point[i]];
	for(i=0;i<N;i++)
		if(num[i]*humb[point[i]]==min) point[i]++;
	return min;
}
int main(){
	int i;
	while(scanf("%d%d",&N,&K)!=EOF){
		memset(point,0,sizeof(point));
		for(i=0;i<N;i++)
			scanf("%d",&num[i]);
		sort(num,num+N);
		for(i=1;i<=K;i++){
			humb[i]=min();
		}
		printf("%d\n",humb[K]);
	}
	return 0;
}

参考答案(时间最优[37]):

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cctype>
#include<vector>
#include<algorithm>
#include<cstring>
#define oo 2000000000
using namespace std;
int n,m;
int a[100005],w[105];
long long ans[100005];

int main()
{
    scanf("%d%d",&m,&n);
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&a[i]);
        w[i]=1;
    }

    ans[1]=1;
    for(int i=2;i<=n+1;i++)
    {
        ans[i]=oo;
        for(int j=1;j<=m;j++)
        {
            while(a[j]*ans[w[j]]<=ans[i-1]) w[j]++;;
            if(a[j]*ans[w[j]]<ans[i]) ans[i]=a[j]*ans[w[j]];
        }
    }
    cout<<ans[n+1];
    return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注