USACO 3.1 Humble Numbers

http://ace.delos.com/usacoprob2?a=SCwjbv7N2zR&S=humble

题意:给你N个质数,求由这些质数组成的,第K大的数是多少。 N<=100 , K<=100000

思路:假设我们现在要求的是第k个数,可以肯定的是这个数一定是由前面的某个数乘以一个给定的质数中的一个得到的,这样我们就可以枚举所要求的这个数是由哪个质数乘以前面的数得到的,为了加快搜索, 我们用一个pos数组,存放第i个质数所要成的数的位置,这样就可以避免每次都是从头开始找。此算法可以在O(M*N)的时间内出解。

代码:

/*
ID : chris
LANG : C++ 
TASK :humble
*/
#include<stdio.h>
#include<string.h>
int K ,N ;
int num[105] ;
int ans[100010] ;
int pos[105] ;

int main(){
	freopen("humble.in","r",stdin);
	freopen("humble.out","w",stdout);
	while(scanf("%d %d",&N,&K) == 2){
		for(int i=1;i<=N;i++)	scanf("%d",&num[i]);
		int c = 0;
		ans[c] = 1 ;
		memset(pos , 0 , sizeof(pos) );
		for(int i=1;i<=K;i++){
			int _min , min_n ;
			_min = 0x7fffffff ;
			for(int j=1;j<=N;j++){
				if(_min > ans[ pos[j] ] * num[j]){
					_min = ans[ pos[j] ] * num[j] ;
				}
			}
			ans[i] = _min ; 
			for(int j=1;j<=N;j++){
				if( ans[ pos[j] ]*num[j] <= _min){
					pos[j]++ ;
				}
			}
 		}
		 printf("%d\n",ans[K]);		
	}	
	return 0 ;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值