首页 > 代码库 > HDOJ1058解题报告

HDOJ1058解题报告

题目地址:

  http://acm.hdu.edu.cn/showproblem.php?pid=1058

题目概述:

  定义因子只有2,3,5,7的数为humble number,输入n,求出第n个humble number。规定1为第1个humble number。

大致思路:

  刚开始看到n小于5842时写的暴力被卡时间,强行打表被卡代码长度,丧心病狂优化暴力反而时间变长了23333

  最后忍不住上了STL,用priority_queue来维护所有humble number的序列,每次取出队列头的一个数,将这个数乘2,3,5,7之后push进队列中就可以了,不过需要注意去重。

  最后说一句,真的要好好学英文!!!我就是因为序数词的结尾写错了白白WA了3遍!!!

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <vector>
 6 #include <ctime>
 7 #include <map>
 8 #include <stack>
 9 #include <queue>
10 #include <cstring>
11 #include <algorithm>
12 using namespace std;
13 
14 #define sacnf scanf
15 #define scnaf scanf
16 #define maxn  6000
17 #define maxm 26
18 #define inf 1061109567
19 #define Eps 0.00001
20 const double PI=acos(-1.0);
21 #define mod 1000033
22 #define MAXNUM 10000
23 void Swap(int &a,int &b) {int t=a;a=b;b=t;}
24 int Abs(int x) {return (x<0)?-x:x;}
25 typedef long long ll;
26 typedef unsigned int uint;
27 
28 ll f[maxn];
29 
30 bool judge(int x)
31 {
32     while(x%6==0) x/=6;
33     while(x%10==0) x/=10;
34     while(x%14==0) x/=14;
35     while(x%15==0) x/=15;
36     while(x%21==0) x/=21;
37     while(x%35==0) x/=35;
38     while(x%2==0) x/=2;
39     while(x%3==0) x/=3;
40     while(x%5==0) x/=5;
41     while(x%7==0) x/=7;
42     return (x==1)?true:false;
43 }
44 
45 ll d[]={2,3,5,7};
46 
47 void init()
48 {
49     int cnt=1;
50     priority_queue<ll,vector<ll>,greater<ll> > q;
51     q.push(1);
52     while(cnt<=5842)
53     {
54         ll x=q.top();q.pop();
55         if(f[cnt-1]==x) continue;
56         f[cnt++]=x;
57         for(int i=0;i<4;i++)
58         {
59             ll ans=x*d[i];
60             if(ans>0&&ans<=2000000000)
61             {
62                 q.push(ans);
63             }
64         }
65     }
66 }
67 
68 int main()
69 {
70     //freopen("data.in","r",stdin);
71     //freopen("data.out","w",stdout);
72     //clock_t st=clock();
73     int n;init();
74     while(~scanf("%d",&n))
75     {
76         if(n==0) break;
77         printf("The %d",n);
78         if(n%10==1&&n%100!=11) printf("st");
79         else if(n%10==2&&n%100!=12) printf("nd");
80         else if(n%10==3&&n%100!=13) printf("rd");
81         else printf("th");
82         printf(" humble number is %lld.\n",f[n]);
83     }
84     //clock_t ed=clock();
85     //printf("\n\nTime Used : %.5lf Ms.\n",(double)(ed-st)/CLOCKS_PER_SEC);
86     return 0;
87 }

 

HDOJ1058解题报告