Now is best !

HDOJ 1058

动态规划题,所有的humble number表示为 n = (2^i)*(3^j)*(5^k)*(7^l)。

需要注意的是,i,j,k,l也只能是humble number,因此只能从已产生的humble number数组中选取。

 1 #include <cstdio>
 2 long long int a[5843];
 3 long long int t1,t2,t3,t4;
 4 
 5 long long int minimum(int a1, int a2, int a3, int a4)
 6 {
 7     long long int ret = a1;
 8     if (a2 <= ret) {
 9         ret = a2;
10     }
11     if (a3 <= ret) {
12         ret = a3;
13     }
14     if (a4 <= ret) {
15         ret = a4;
16     }
17     if (ret == a1)
18         t1++;
19     if (ret == a2)
20         t2++;
21     if (ret == a3)
22         t3++;
23     if (ret == a4)
24         t4++;
25     return ret;
26 }
27 void init()
28 {
29     a[1] = 1;
30     t1 = t2 = t3 = t4 = 1;
31     for(int i=2; i<=5842; ++i) {
32         a[i] = minimum(a[t1]*2, a[t2]*3, a[t3]*5, a[t4]*7);
33     }
34 }
35 int main()
36 {
37 #ifdef LOCAL
38     freopen("data.in","r",stdin);
39     freopen("data.out","w",stdout);
40 #endif
41     int n;
42     
43     init();
44 
45     while ( (scanf("%d",&n) == 1) && (n != 0)) {
46         if (n%100 == 11 || n%100 == 12 || n%100 == 13) {
47             printf("The %dth humble number is %d.\n",n,a[n]);
48             continue;
49         }
50         switch(n%10) {
51             case 1:
52                 printf("The %dst humble number is %d.\n",n,a[n]);
53                 break;
54             case 2:
55                 printf("The %dnd humble number is %d.\n",n,a[n]);
56                 break;
57             case 3:
58                 printf("The %drd humble number is %d.\n",n,a[n]);
59                 break;
60             default:
61                 printf("The %dth humble number is %d.\n",n,a[n]);
62                 break;
63         }
64     }
65     return 0;
66 }

 

posted on 2013-10-23 23:03  fang0703  阅读(277)  评论(0)    收藏  举报

导航