zoukankan      html  css  js  c++  java
  • 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.
    ",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.
    ",hum[n]);
    34     }    
    35     return 0;
    36 }
    View Code

     

  • 相关阅读:
    92 log4j日志记录
    35 反射封装占位
    34 jdbc工具封装
    33 mysql约束的增删
    32 Dao层和impl层
    31 jdbc查询,javaBean引入
    30 jdbc事务设置
    29 jdbc连接带数据操作 模板(直接复制来用)
    28 jdbc驱动包导入java项目及连接数据库流程
    27 MySQL与Oracle在语法上的一些不同点
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4289572.html
Copyright © 2011-2022 走看看