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 }
浙公网安备 33010602011771号