首页 > 代码库 > 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解题报告
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。