hdu1058丑数(优先队列、暴力打表)

hdu1058

题意:当一个数只有2、3、5、7这四种质因数时(也可以一种都没有或只有其中几种),这个数就是丑数,输出第 n 个丑数是多少;

其实并没有发现hdu把这道题放在 dp 专题里的意图,我的思路就是预处理出丑数数组,然后读入 n 就直接输出第 n 个丑数。我自己又一种想法,询问翔神之后又学到了另一种做法。

我自己的生成数组的方法是:数组的第一个元素定为1,然后用优先队列,首先将2,3,5,7放入优先队列,每次从队列中取出最小的一个数,将它放入数组中,然后分别将它乘上2,3,5,7后放入优先队列中,这样重复直到从队列中取出的数大于2000000000的时候就结束。对于处理重复元素,只要将优先队列中拿出的元素与数组中的上一次放入的数比较,如果相等就不进行操作,若不等则进行操作,这样就可以了。

 

 1 #include<stdio.h>

 2 #include<queue>

 3 using namespace std;  4 #define LL long long 

 5 LL hum[10000],count=1;  6 

 7 void init(){  8 // printf("1111111111");

 9     priority_queue<LL ,vector<LL>,greater<LL> >q; 10     q.push(2); 11     q.push(3); 12     q.push(5); 13     q.push(7); 14     hum[1]=1; 15     LL a=q.top(); 16  q.pop(); 17     

18     while(a<=2000000000){ 19         if(a!=hum[count]){ 20             hum[++count]=a; 21             q.push(a*2); 22             q.push(a*3); 23             q.push(a*5); 24             q.push(a*7); 25  } 26         a=q.top(); 27  q.pop(); 28  } 29     return; 30 } 31 

32 int main(){ 33 // printf("1111111111");

34  init(); 35     int n; 36     while(scanf("%d",&n)!=EOF&&n!=0){ 37         printf("The %d",n); 38         if(n%100==11||n%100==12||n%100==13)printf("th "); 39         else if(n%10==1)printf("st "); 40         else if(n%10==2)printf("nd "); 41         else if(n%10==3)printf("rd "); 42         else printf("th "); 43         printf("humble number is %lld.\n",hum[n]); 44  } 45     return 0; 46 }
View Code

 

翔神告诉我另一种做法,首先数组 hum[10000] 第一个元素还是1,然后定 a2 , a3 , a5 , a7 四个数分别表示 2 3 5 7 接下来要乘的数组元素的下标,起始都为 1 ,分别比较 2 * hum [ a2 ] , 3* hum [ a3 ] ,5 * hum [ a5 ] ,7 * hum [ a7 ] ,最小的一个放入数组,并将其对应的数组下标 a几 ++,重复直到超过2000000000

 

 1 #include<stdio.h>

 2 #define LL long long

 3 LL hum[10000];  4 

 5 void init(){  6     hum[1]=1;  7     LL a2=1,a3=1,a5=1,a7=1,count=1;  8     while(hum[count]<2000000000){  9         LL min=3000000000; 10         if(2*hum[a2]<min)min=2*hum[a2]; 11         if(3*hum[a3]<min)min=3*hum[a3]; 12         if(5*hum[a5]<min)min=5*hum[a5]; 13         if(7*hum[a7]<min)min=7*hum[a7]; 14         hum[++count]=min; 15         if(2*hum[a2]==min)a2++; 16         if(3*hum[a3]==min)a3++; 17         if(5*hum[a5]==min)a5++; 18         if(7*hum[a7]==min)a7++; 19  } 20     return; 21 } 22 

23 int main(){ 24  init(); 25     int n; 26     while(scanf("%d",&n)!=EOF&&n!=0i){ 27         printf("The %d",n); 28         if(n%100==11||n%100==12||n%100==13)printf("th "); 29         else if(n%10==1)printf("st "); 30         else if(n%10==2)printf("nd "); 31         else if(n%10==3)printf("rd "); 32         else printf("th "); 33         printf("humble number is %lld.\n",hum[n]); 34  } 35     return 0; 36 }
View Code

 

你可能感兴趣的:(优先队列)