POJ 2247 小DP?

来源:互联网 发布:柔术 知乎 编辑:程序博客网 时间:2024/05/16 13:46

题意:定义H***数为质因子仅有2、3、5、7的数以及1,将所有的H***数排序,输出序列中第n个H***数。

说是DP。。也看不出来啥DP的特征,Openjudge是把这题分到DP一类里了。因为H***数仅由特定的质因子构成,所以每一个H***数都可以由已知的H***数乘2、3、5、7得来。我们预处理出数据范围n以内的所有H***数,O(1)查询。处理方式很简单,代码易懂。

唯一比较恶心的就是这道题的输出方式,考验英语基本功。→.→

#include <cstdio>#include <algorithm>#include <cstring>using namespace std;int n, p2, p3, p5, p7, f[5845];int main(){    f[1] = n = p2 = p3 = p5 = p7 = 1;    while(n < 5845)    {        f[++n] = min(min(f[p2]*2, f[p3]*3), min(f[p5]*5, f[p7]*7));        if(f[n]==f[p2]*2) p2++;        if(f[n]==f[p3]*3) p3++;        if(f[n]==f[p5]*5) p5++;        if(f[n]==f[p7]*7) p7++;    }    while(scanf("%d", &n) && n)    {        printf("The %d",n);        if      (n%10==1 && n/10%10!=1) printf("st");        else if (n%10==2 && n/10%10!=1) printf("nd");        else if (n%10==3 && n/10%10!=1) printf("rd");        else                            printf("th");        printf(" humble number is %d.\n",f[n]);    }     return 0;}
0 0
原创粉丝点击