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



你可能感兴趣的:(USACO 3.1 Humble Numbers)