码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-02-13 06:56:54      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

标签:

原文地址:http://www.cnblogs.com/cenariusxz/p/4289572.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!